将 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 控件的主要内容,如果未能解决你的问题,请参考以下文章