我在WPF中使用TextBlock来显示格式化文本。显示工作正常,但当我尝试将内容保存为RTF格式的文件时,不使用新的行字符。我得到了“一行文字”。
我使用这样的代码行:
displayBuffer.Inlines.Add(new Run("Blabla \n")
{ TextDecorations = TextDecorations.Underline, Foreground = Brushes.Blue });
并保存:
FileStream fileStream = new FileStream(dlg.FileName, FileMode.Create);
TextRange range = new TextRange(displayBuffer.ContentStart, displayBuffer.ContentEnd);
range.Save(fileStream, DataFormats.Rtf);
我尝试了\ n \ r \ n和Environment.NewLine,但没有成功。 知道我做错了吗?
编辑: 发布流程字符串以获得正确结果的相当有趣的想法(Stefano参考)。我在这里查看了RTF格式http://latex2rtf.sourceforge.net/rtfspec_7.html#rtfspec_18并且\ par可能是我想要的但是\ line会好的。
奇怪的是,Range.Save生成的RTF文件根本不包含\ line或\ par? 所以我可以用你的引用中描述的特殊字符序列替换\ n,并用\ par替换RTF文件中的这个字符。
但是我宁愿在保存文件之前这样做。有没有办法做一个等效的range.Save(fileStream,DataFormats.Rtf)来保存内存中的字符串?否则我将需要编写一个临时文件来处理它并重写最后一个,但所有这看起来很丑陋的东西应该是简单的吗?
答案 0 :(得分:2)
以下代码实现了一个将RichTextBox作为参数的方法,并返回表示RichTextBox的纯文本内容的字符串。 该方法从RichTextBox的内容创建一个新的TextRange,使用ContentStart和ContentEnd指示要提取的内容的范围。 ContentStart和ContentEnd属性都返回TextPointer,并且可以在表示RichTextBox内容的底层FlowDocument上访问。 TextRange提供Text属性,该属性将TextRange的纯文本部分作为字符串返回。
试试这个:
string StringFromRichTextBox(RichTextBox rtb)
{
TextRange textRange = new TextRange(
// TextPointer to the start of content in the RichTextBox.
rtb.Document.ContentStart,
// TextPointer to the end of content in the RichTextBox.
rtb.Document.ContentEnd
);
// The Text property on a TextRange object returns a string
// representing the plain text content of the TextRange.
return textRange.Text;
}
要正确保存rtf格式,请尝试以下操作:
using (FileStream file = new FileStream(fileLocation, FileMode.Create))
{
textrange.Save(file, System.Windows.DataFormats.Rtf);
}
答案 1 :(得分:1)
也许Unicode Line-Separator(U + 2028)可以正常工作:
\u2028
答案 2 :(得分:0)
在我看来,你应该使用RichTextBox而不是TextBlock(如果你想将文本保存在rft文件中)。此外,插入新的LineBreak而不是简单的“\ n”。