从文本块在 RTF 中保存文本时,WPF 换行符不起作用

本文关键字:文本 WPF 不起作用 换行符 RTF 保存 | 更新日期: 2023-09-27 18:34:53

我在 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);

我已经尝试了' ''r'和环境.换行符的行尾,但没有成功。知道我做错了什么吗?

编辑:发布进程字符串以获得正确结果的有趣想法(斯特凡诺参考(。我在这里看了 RTF 格式 http://latex2rtf.sourceforge.net/rtfspec_7.html#rtfspec_18 ''par 可能是我想要的,但 ''line 可以。

奇怪的是,Range.Save 生成的 RTF 文件根本不包含 ''line 或 ''par ?因此,我可以按照您的参考资料中的说明将 ' 替换为特殊的字符序列,并将 RTF 文件中的此字符替换为 ''par。

但是,我更愿意在保存文件之前执行此操作。有没有办法做一个等效的范围。Save(fileStream, DataFormat.Rtf( 以将字符串保存在内存中?否则,我将需要编写一个临时文件来处理它并重写最终文件,但对于应该简单的事情来说,这一切看起来都很丑陋?

从文本块在 RTF 中保存文本时,WPF 换行符不起作用

下面的代码实现一个方法,该方法将 RichTextBox 作为参数,并返回一个表示 RichTextBox 的纯文本内容的字符串。该方法从 RichTextBox 的内容创建一个新的 TextRange,使用 ContentStart 和 ContentEnd 来指示要提取的内容的范围。ContentStart 和 ContentEnd 属性都返回一个 TextPointer,并且可以在表示 RichText Box 内容的基础 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);
}

也许 Unicode 行分隔符 (U+2028( 确实有效:

'u2028

在我看来,你应该使用RichTextBox而不是TextBlock(如果你想将文本保存在rft文件中(。此外,插入一个新的换行符而不是简单的"'"。