WPF从TextBlock保存RTF中的文本时,新行不起作用

时间:2014-12-19 15:52:29

标签: c# wpf

我在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)来保存内存中的字符串?否则我将需要编写一个临时文件来处理它并重写最后一个,但所有这看起来很丑陋的东西应该是简单的吗?

3 个答案:

答案 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”。