将 RTF 文本设置为 WPF RichTextBox 控件

Posted

技术标签:

【中文标题】将 RTF 文本设置为 WPF RichTextBox 控件【英文标题】:Set RTF text into WPF RichTextBox control 【发布时间】:2010-11-24 22:23:33 【问题描述】:

我有这个 RTF 文本:

\rtf1\ansi\ansicpg1252\deff0\deflang1033\fonttbl\f0\fnil\fcharset0 Arial;
\colortbl ;\red0\green0\blue0;\red255\green0\blue0;
\viewkind4\uc1\pard\qc\cf1\fs16 test \b bold \cf2\b0\i italic\cf0\i0\fs17 
\par 

如何将此文本设置为WPF RichTextBox?


解决方案:

public void SetRTFText(string text)

    MemoryStream stream = new MemoryStream(ASCIIEncoding.Default.GetBytes(text));
    this.mainRTB.Selection.Load(stream, DataFormats.Rtf);

【问题讨论】:

只有1句话,你确定要ASCII编码吗?可能是 UTF8 或默认值通常更有意义。 是的,如果有的话,我需要使用 ASCII 编码。感谢您的提示:) 其实,你没有在这段代码中使用ASCII编码...Default实际上是指Encoding.Default,所以它是系统默认的ANSI代码页。谨防通过派生类访问静态成员,这往往会产生误导。 此技术有效,但如果 text 参数为空字符串,我会收到错误消息。如果这是一种可能的情况,那么您可能需要添加特殊处理。 【参考方案1】:

你真的必须以字符串开头吗?

加载 RTF 的一种方法是:

rtfBox.Selection.Load(myStream, DataFormats.Rtf);

如果要替换现有文本,您可能应该在此之前调用 SelectAll()。

因此,最坏的情况是,您必须将字符串写入 MemoryStream,然后将该流提供给 Load() 方法。不要忘记在两者之间设置 Position=0。

但我在等着看有人想出更优雅的东西。

【讨论】:

rtfBox.Selection.Load 是我需要的。谢谢你:) 与其使用Selection 属性并担心调用SelectAll,不如使用new TextRange( rtfBox.Document.ContentStart, rtfBox.Document.ContentEnd ),然后在TextRange 上调用Load(Selection 本身就是一个TextRange)。 使用 devios 的 sn-p,这有效:TextRange textRange = new TextRange( rtfBox.Document.ContentStart, rtfBox.Document.ContentEnd ); MemoryStream ms = new MemoryStream( ASCIIEncoding.ASCII.GetBytes( rtfText ) ); textRange.Load( ms, DataFormats.Rtf );【参考方案2】:

创建扩展方法

    public static void SetRtf(this RichTextBox rtb, string document)
    
        var documentBytes = Encoding.UTF8.GetBytes(document);
        using (var reader = new MemoryStream(documentBytes))
        
            reader.Position = 0;
            rtb.SelectAll();
            rtb.Selection.Load(reader, DataFormats.Rtf);
        
    

那么你就可以做WinForm-esque风格了

richTextBox1.SetRtf(rtf);

【讨论】:

你不能使用扩展方法作为属性。【参考方案3】:
string rtf = @"\rtf1\ansi\ansicpg1252\deff0\deflang1033\fonttbl\f0\fnil\fcharset0 Arial; \colortbl ;\red0\green0\blue0;\red255\green0\blue0; \viewkind4\uc1\pard\qc\cf1\fs16 test \b bold \cf2\b0\i italic\cf0\i0\fs17  \par  ";
richTextBox1.Rtf = rtf;

一切正常

【讨论】:

这是针对 Windows 窗体的,问题指定 WPF。【参考方案4】:

编辑:此答案假定 WinForms 而不是 WPF。

只需使用 RichTextBox.Rtf:

string rtf = @"\rtf1\ansi\ansicpg1252\deff0\deflang1033\fonttbl\f0\fnil\fcharset0 Arial; \colortbl ;\red0\green0\blue0;\red255\green0\blue0; \viewkind4\uc1\pard\qc\cf1\fs16 test \b bold \cf2\b0\i italic\cf0\i0\fs17  \par  ";
richTextBox1.Rtf = rtf;

【讨论】:

哦,我的错。我想念你在哪里使用 WPF。

以上是关于将 RTF 文本设置为 WPF RichTextBox 控件的主要内容,如果未能解决你的问题,请参考以下文章

将RTF标记剥离为纯文本

如何将 ANSI 文本转换为 Unicode?

将 JTextPane 上标文本另存为 RTF

RichEditBox (UWP) 在设置 Rtf 文本时忽略字体和前景

将插入符号/光标位置设置为字符串值 WPF 文本框的末尾

在Java中使用格式将rtf转换为html