WPF RichTextBox内容可以在没有FontFamily和FontSize的情况下进行序列化吗?

时间:2015-02-11 19:04:04

标签: wpf richtextbox rtf flowdocument

就像你在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。

2 个答案:

答案 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