【发布时间】:2015-04-12 07:11:08
【问题描述】:
就像您在 StackOverflow 上看到的编辑器一样,我希望用户能够指定他们的部分文本应该是粗体、斜体或下划线,但我不希望他们能够设置字体大小或字体系列;这些需要从可视化树中的其他位置继承。
当将 WPF RichTextBox 控件放入空窗口并提供几个字符的文本时,富文本的序列化表示始终包括 FontFamily。例如,在 LINQPad 中:
void Main()
{
var window = new Window();
var editor = new RichTextBox();
window.Content = editor;
window.ShowDialog();
var rtf = RtfUtility.ConvertToRtf(editor.Document);
rtf.Dump();
}
我输入了“你好,世界!”进入 RichTextBox。
{\rtf1\ansi\ansicpg1252\uc1\htmautsp\deff2{\fonttbl{\f0\fcharset0 Times New Roman;}{\f2\fcharset0 Segoe UI;}}{\colortbl\red0\green0\blue0;\red255\green255\blue255;}\loch\hich\dbch\pard\plain\ltrpar\itap0{\lang1033\fs18\f2\cf0 \cf0\ql{\f2 {\ltrch HELLO, WORLD!}\li0\ri0\sa0\sb0\fi0\ql\par}}}
RTF序列化代码没什么特别的:
var range = new TextRange(document.ContentStart, document.ContentEnd);
using (var stream = new MemoryStream())
{
range.Save(stream, DataFormats.Rtf);
stream.Position = 0;
using (var reader = new StreamReader(stream, Encoding.UTF8))
return reader.ReadToEnd();
}
序列化表示同时引用 Times New Roman 和 Segoe UI,但这是不可取的。
是否可以呈现富文本并从其他地方继承字体系列和大小,以及在没有这些属性的情况下对其进行序列化?
我想另一种方法是在每次反序列化文本时将 FontFamily 和 FontSize 设置为我想要的任何值 - 但这看起来很老套。如果可行,我也愿意接受不涉及 RichTextBox 的完全不同的解决方案。
【问题讨论】:
标签: wpf richtextbox rtf flowdocument