Как добавить \ строку в RTF с помощью элемента управления RichTextBox - PullRequest
17 голосов
/ 06 января 2011

При использовании элемента управления Microsoft RichTextBox можно добавлять новые строки, например, такие ...

richtextbox.AppendText(System.Environment.NewLine); // appends \r\n

Однако, если вы теперь просматриваете сгенерированный rtf, символы \ r \ n преобразуются в \ parnot \ line

Как вставить управляющий код \ line в сгенерированный RTF?

Что не работает:

Замена токена

Хаки, такие как вставка токена в конец строки и последующая его замена по факту, примерно так:

string text = "my text";
text = text.Replace("||" "|"); // replace any '|' chars with a double '||' so they aren't confused in the output.
text = text.Replace("\r\n", "_|0|_"); // replace \r\n with a placeholder of |0|

richtextbox.AppendText(text);

string rtf = richtextbox.Rtf;
rtf.Replace("_|0|_", "\\line"); // replace placeholder with \line
rtf.Replace("||", "|"); // set back any || chars to |

Это почти сработало, оно сломалосьвниз, если вам нужно поддерживать текст справа налево, поскольку последовательность управления справа налево всегда заканчивается в середине заполнителя.

Отправка ключевых сообщений

public void AppendNewLine()
{
    Keys[] keys = new Keys[] {Keys.Shift, Keys.Return};
    SendKeys(keys);
}

private void SendKeys(Keys[] keys)
{
    foreach(Keys key in keys)
    {
        SendKeyDown(key);
    }
}

private void SendKeyDown(Keys key)
{
    user32.SendMessage(this.Handle, Messages.WM_KEYDOWN, (int)key, 0);
}

private void SendKeyUp(Keys key)
{
    user32.SendMessage(this.Handle, Messages.WM_KEYUP, (int)key, 0);
}

Это также заканчивается преобразованием в \ par

Есть ли способ опубликовать сообщение непосредственно в элементе управления msftedit, чтобы вставить управляющий символ?

Я в полном замешательстве, есть идеи, ребята?Спасибо за вашу помощь!

Ответы [ 3 ]

20 голосов
/ 07 января 2012

Добавление Unicode «Line Separator» (U + 2028) работает, насколько показало мое тестирование:

private void Form_Load(object sender, EventArgs e)
{
    richText.AppendText("Hello, World!\u2028");
    richText.AppendText("Hello, World!\u2028");
    string rtf = richText.Rtf;
    richText.AppendText(rtf);
}

Когда я запускаю программу, я получаю:

Hello, World!
Hello, World!
{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil\fcharset0 Courier New;}}
{\colortbl ;\red255\green255\blue255;}
\viewkind4\uc1\pard\cf1\f0\fs17 Hello, World!\line Hello, World!\line\par
}

Он добавил \line вместо \par.

7 голосов
/ 18 февраля 2011

Поскольку вы хотите использовать другой код RTF, я думаю, что вам, возможно, придется забыть о упрощенном методе AppendText () и вместо этого напрямую манипулировать свойством .Rtf вашего RichTextBox. Вот образец (протестированный) для демонстрации:

RichTextBox rtb = new RichTextBox();
//this just gets the textbox to populate its Rtf property... may not be necessary in typical usage
rtb.AppendText("blah");
rtb.Clear();

string rtf = rtb.Rtf;

//exclude the final } and anything after it so we can use Append instead of Insert
StringBuilder richText = new StringBuilder(rtf, 0, rtf.LastIndexOf('}'), rtf.Length /* this capacity should be selected for the specific application */);

for (int i = 0; i < 5; i++)
{
    string lineText = "example text" + i;
    richText.Append(lineText);
    //add a \line and CRLF to separate this line of text from the next one
    richText.AppendLine(@"\line");
}

//Add back the final } and newline
richText.AppendLine("}");


System.Diagnostics.Debug.WriteLine("Original RTF data:");
System.Diagnostics.Debug.WriteLine(rtf);

System.Diagnostics.Debug.WriteLine("New Data:");
System.Diagnostics.Debug.WriteLine(richText.ToString());


//Write the RTF data back into the RichTextBox.
//WARNING - .NET will reformat the data to its liking at this point, removing
//any unused colors from the color table and simplifying/standardizing the RTF.
rtb.Rtf = richText.ToString();

//Print out the resulting Rtf data after .NET (potentially) reformats it
System.Diagnostics.Debug.WriteLine("Resulting Data:");
System.Diagnostics.Debug.WriteLine(rtb.Rtf);

Выход:

Исходные данные RTF:

{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}
\viewkind4\uc1\pard\f0\fs17\par
}

Новые данные RTF:

{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}
\viewkind4\uc1\pard\f0\fs17\par
example text0\line
example text1\line
example text2\line
example text3\line
example text4\line
}

Результирующие данные RTF:

{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}
\viewkind4\uc1\pard\f0\fs17\par
example text0\line example text1\line example text2\line example text3\line example text4\par
}
5 голосов
/ 11 июня 2012

если вы используете абзацы для записи в richtextbox, вы можете использовать тот же код LineBreak (), как показано ниже

Paragraph myParagraph = new Paragraph();
FlowDocument myFlowDocument = new FlowDocument();

// Add some Bold text to the paragraph
myParagraph.Inlines.Add(new Bold(new Run(@"Test Description:")));
myParagraph.Inlines.Add(new LineBreak()); // to add a new line use LineBreak()
myParagraph.Inlines.Add(new Run("my text"));
myFlowDocument.Blocks.Add(myParagraph);
myrichtextboxcontrolid.Document = myFlowDocument;

Надеюсь, это поможет!

...