将RTF文本设置到WPF RichTextBox控件中

36

我有这段 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);
}

只有一个备注,你确定要使用ASCII编码吗?虽然可以使用,但通常使用UTF8或默认编码更合理。 - H H
是的,如果我有需要,ASCII编码就是我需要使用的。谢谢你的提示 :) - Andrija
1
实际上,这段代码并没有使用 ASCII 编码... Default 实际上是指 Encoding.Default,因此它是系统的默认 ANSI 代码页。要注意不要通过派生类访问静态成员,这经常会导致误解。 - Thomas Levesque
这种技术是可行的,但如果文本参数为空字符串,则会出现错误。如果这是可能的情况,那么您可能需要添加特殊处理。 - Phil Jollans
4个回答

46

你真的必须使用字符串作为起点吗?

一种加载RTF文件的方法如下:

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

如果你想替换现有文本,那么在此之前最好调用SelectAll()。

因此,在最坏的情况下,你需要将字符串写入MemoryStream中,然后将该流提供给Load()方法。别忘了在两次使用之间将Position设置为0。

但我期待看到有人能够提出更加优雅的解决方案。


rtfBox.Selection.Load 是我需要的。谢谢 :) - Andrija
12
不用使用Selection属性并且担心调用SelectAll,你可以尝试使用new TextRange( rtfBox.Document.ContentStart, rtfBox.Document.ContentEnd ),然后在TextRange上调用Load方法(Selection本身就是一个TextRange)。 - devios1
1
使用devios的代码片段,这个可以工作:TextRange textRange = new TextRange( rtfBox.Document.ContentStart, rtfBox.Document.ContentEnd ); MemoryStream ms = new MemoryStream( ASCIIEncoding.ASCII.GetBytes( rtfText ) ); textRange.Load( ms, DataFormats.Rtf ); - Tom Sirgedas

9
创建一个扩展方法
    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的样式。 richTextBox1.SetRtf(rtf);

你不能将扩展方法用作属性。 - Andrija

-2
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;

它正常运行


6
这是针对Windows Forms的,问题指定了WPF。 - Marty

-3

编辑:本答案假设使用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。 - J. Random Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接