就像你在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();
}
我进入了“HELLO,WORLD!”进入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。
答案 0 :(得分:0)
FlowDocument假定Sergoe UI为默认字体。此字体采用FlowDocument对象的样式。
要改变这一点:
editor.Document.FontFamily = new FontFamily("Times New Roman");
editor.Document.FontSize = 12;
您还可以在App.xaml中使用xaml声明或为每个FlowDocument以编程方式为所有FlowDocuments创建样式:
var style = new Style(typeof(FlowDocument));
style.Setters.Add(new Setter(FlowDocument.FontFamilyProperty, new FontFamily("Times New Roman")));
style.Setters.Add(new Setter(FlowDocument.FontSizeProperty, 12));
editor.Resources.Add(typeof(FlowDocument), style)
为段落创建样式(新样式(typeof(段落)))时,您还可以更改每个段落的设置。
不幸的是,序列化保存了FlowDocument的资源和所有未继承的设置。
答案 1 :(得分:0)
您可以使用文字范围:
$db