Как вы можете добавить \ line, а не \ par к System.Windows.Forms.RichTextBox - PullRequest
2 голосов
/ 26 июня 2009

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

У меня есть массив строк, которые я хотел бы добавить в RichTextBox, но я не хочу создавать новые абзацы в RTF. Я хочу, чтобы строки разделялись командами \ line, а не \ par в RTF. (Я хочу смоделировать кого-то, набрав shift + enter вместо просто 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;
    }
}

1 Ответ

1 голос
/ 26 июня 2009

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

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

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

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

rtb.Text += textInfo.Text;

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

Edit:

Поскольку вы добавляете строки в ваш документ построчно, и вы знаете, что элемент управления генерирует \ par для \ r \ n, вы можете добавить некоторый уникальный текст (вы можете проявить креативность здесь, я использовал REPLN) к линии, которые вы хотите разорвать с помощью \ линии. Конечно, вы должны быть в состоянии определить строки, которые вы хотите заменить, что я предполагаю, что вы делаете из своего вопроса. После добавления вашего уникального текста вы можете снова заменить 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");
...