C# 从文本块以RTF格式保存文本时,WPF新行不起作用

C# 从文本块以RTF格式保存文本时,WPF新行不起作用,c#,wpf,C#,Wpf,我在WPF中使用文本块来显示格式化文本。显示效果很好,但当我试图以RTF格式将内容保存到文件时,不会使用新行字符。我得到一个“一行文字” 我使用如下代码行: displayBuffer.Inlines.Add(new Run("Blabla \n") { TextDecorations = TextDecorations.Underline, Foreground = Brushes.Blue }); 并保存为: FileStream fileStream = new

我在WPF中使用文本块来显示格式化文本。显示效果很好,但当我试图以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格式,\par可能是我想要的,但是\line可以

奇怪的是,Range.Save生成的RTF文件根本不包含\line或\par? 因此,我可以用参考中描述的特殊字符序列替换\n,并用\par替换RTF文件中的此字符


但是,我更希望在保存文件之前执行此操作。是否有一种方法可以等效于range.Save(fileStream,DataFormats.Rtf)将字符串保存在内存中?否则,我将需要编写一个临时文件来处理它并重写最后一个文件,但这一切看起来都很丑陋,因为有些东西应该很简单?

也许Unicode行分隔符(U+2028)确实可以工作:

\u2028

下面的代码实现了一个将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);
}

在我看来,您应该使用RichTextBox而不是TextBlock(如果您想将文本保存在rft文件中)。此外,插入一个新的而不是一个简单的“\n”。

这可以工作,但它会删除“格式化”。我已尝试将DataFormats.Rtf替换为DataFormats.Text,并且输出正确地包含\n。这只是RTF格式似乎不起作用我编辑我的解决方案,尝试一下,不幸的是,现在我无法在我的visual studio上自己检查:)您所建议的就是我所描述的!我用Word 2013打开文件,内容包含所有文本和格式,但不幸的是,换行符似乎因某种原因而丢失。我相信这与rtf文件字符集通常是“\ansi”和getter使用的unicode代码页“\ansicpg1252”有关。输入文本中的换行符按照rtf规范编码为rtf段落分隔符“\par”,并由unicode rtf代码页作为换行符重新发出。不幸的是,这没有帮助。我尝试过\u2028以及\u000D\u000A none Works这可能是最好的解决方案,但对于换行的一个小问题,它需要大量重写。至少我可以使用DataFormats.text保存文本,而无需格式化。我还尝试了DataFormats.Html格式。它可以正确编译,但在运行时,我不幸(至少在.NET 4.0中)得到了一个异常错误(比如HTML格式不受支持???),方法TextRange.Save只支持Text、Xaml、Rtf和XamlPackage数据格式。我尝试使用以下代码但没有成功LineBreak lb=new LineBreak();displayBuffer.Inlines.Add(lb);您必须使用LineBreak和RichTextBox,否则它将不起作用。我建议您也在此处阅读: