Как вы можете добавить \ line, а не \ par к System.Windows.Forms.RichTextBox

2

Я использую элемент управления System.Windows.Forms.RichTextBox в .NET 2.0 и использую С#.

У меня есть массив строк, которые я хотел бы добавить к RichTextBox, но я не хочу создавать новые абзацы в RTF. Я хочу, чтобы строки были разделены командами \line, а не \par в RTF. (Я хочу, чтобы кто-то набирал shift + enter вместо ввода.)

Мне не удалось успешно получить RichTextBox.AppendText, чтобы сгенерировать команду \line вместо команды \par. Поэтому я вставлял свой текст, а затем вручную вставлял команду \line в сам RTF.

Это не удается, когда одна из строк содержит символы, которые экранированы в RTF (один закрытый запрос преобразуется в \rquote, например), потому что я не могу найти исходную строку, которую я вставлял в RTF.

С помощью этого решения мне нужно будет избежать символов в моей строке, прежде чем искать его в RTF.

Есть ли способ заставить элемент управления RichTextBox генерировать команду \line, а не команду \par, или мне придется придерживаться этого решения и искать строку с экранированной RTF.

Вот мой текущий код:

string[] lines = textInfo.Lines;

for (int i = 0; i < lines.Length; i++)
{
    rtb.AppendText(lines[i]);

    if (i < lines.Length - 1)
    {
        string rtf = rtb.Rtf;

        int insertedIndex = rtf.LastIndexOf(lines[i]);

        int length = lines[i].Length;

        rtf = rtf.Insert(insertedIndex + length, @"\line");

        rtb.Rtf = rtf;
    }
}
Теги:
rtf
richtextbox

1 ответ

1

Элемент управления RichTextBox автоматически обновляет свойства Text и Rtf при изменении любого из них. Любой текст, добавленный к свойству Text, будет автоматически обновлен до свойства RTF.

Из некоторого быстрого тестирования кажется, что элемент управления RichTextBox автоматически вставляет \par в любую новую строку (введите, shift-enter на элемент управления и \r\n\r\n Environment.NewLine на свойство Text и AppendText() функция на самом элементе управления). Это то, что вы сообщаете как свою проблему.

Я не верю, что есть способ изменить способ управления RTF. Я просто добавлю текст и позволю RichTextBox управлять обработкой любых символов, которые могут потребоваться экранирование, а затем заменить все \par на\line.

Предполагая, что textInfo является TextBox, и вы хотите добавить его содержимое в конец некоторого уже существующего RTF (если не заменить + = для = в строке 1

rtb.Text += textInfo.Text;

rtb.Rtf = rtb.Rtf.Replace(@"\par", @"\line");

Edit:

Поскольку вы добавляете строки в свой документ по строкам, и знаете, что элемент управления генерирует параметр \par для\r\n, вы можете опубликовать какой-то уникальный текст (вы можете стать креативным здесь, я использовал REPLN) линии, которые вы хотите разбить с помощью \line. Конечно, вам нужно будет определить линии, которые вы хотите заменить, и я полагаю, что вы делаете это из своего вопроса. После добавления вашего уникального текста вы можете снова заменить REPLN\par на \line. Не такой элегантный, как мне бы хотелось, но он выполняет свою работу.

foreach (string line in textInfo.Lines)
{
   //assuming your condition is that the string contains the substring, "substring"
   rtb.AppendText(line + (line.Contains("substring") ? "REPLN\r\n" : "\r\n"));
}

rtb.Rtf = richTextBox1.Rtf.Replace(@"REPLN\par", @"\line");
  • 0
    Это тоже было моим открытием. Я не хочу заменять все \ par экземпляры на \ line экземпляры в RTF, поэтому я думаю, что мне придется продолжать использовать мое решение, если я не найду что-то лучшее.
  • 0
    Полагаю, вы правы, это убило бы все параграфы в вашем документе. Если вы не найдете способ выборочно изменить способ, которым элемент управления RichTextBox переносит строки, это время взломать! Редактирование ответа ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню