将WPF RichTextBox序列化为XAML与RTF

dev*_*os1 5 wpf xaml serialization rtf richtextbox

我有一个RichTextBox并且需要将其内容序列化到我的数据库纯粹用于存储目的.看起来我可以选择序列化为XAML还是RTF,并且想知道通过RTF序列化到XAML是否有任何优势,我认为这更有"标准".

特别是,我是否通过序列化为RTF而不是XAML而失去了任何功能?我理解XAML支持FlowDocument中的自定义类,但我目前没有使用任何自定义类(尽管可扩展性可能是使用XAML的充分理由).

更新:我最终使用RTF,因为它支持文本编码的嵌入式图像.XAML似乎没有在其编码中包含图像数据,并且XamlPackage编码为二进制,因此RTF对我来说效果更好.到目前为止,我还没有发现任何能力缺乏.

Ray*_*rns 5

如果您的所有用户都在输入RichTextBox并进行字符格式化,则RTF与XAML一样好.但是,您可以在UI中公开许多不可转换为RTF的FlowDocument功能.

以下是FlowDocument(和RichTextBox)功能的一些示例,这些功能在RTF中无法表达或以不同方式实现:

  • 一个Block可以有一个任意的BorderBrush,包括带有stop的渐变画笔,VisualBrush
  • Section具有HasTrailingParagraphBreakOnPaste属性
  • Floater/ClearFloater的实现方式不同
  • 可以为每个块启用/禁用连字符,而不仅仅是每个段
  • WPF样式和ResourceDictionaries可以包含在Resources属性中
  • 任意WPF UI(如绑定的CheckBoxes等)可以嵌入RichTextBox中,并可以从其他窗口剪切和粘贴.

例如,假设您希望允许用户在"当前日期/时间"字段中拖动或剪切/粘贴到RichTextBox中,该RichTextBox始终显示当前日期和时间.这可以通过添加具有InlineUIContainer和已绑定控件的第二个只读RichTextBox来完成.这甚至可以在从其他应用程序剪切和粘贴时使用,并且不需要自定义控件.

另一个考虑因素是在FlowDocument和RTF之间进行转换的代码相对复杂,因此它的性能可能低于使用XAML.当然松散的XAML不包括图像等 - 因为你需要使用XamlPackage.我将XamlPackage作为byte []存储在数据库中,但您也可以选择将Base64编码为字符串存储.

最重要的是,它实际上取决于您是否希望用户能够使用RTF中不可用的功能.即使您的应用程序不包含生成使用这些功能的FlowDocuments的工具,也可以从其他应用程序中剪切并粘贴它们.