wpf - 将 WPF RichTextBox 序列化为 XAML 与 RTF

标签 wpf xaml serialization richtextbox rtf

我有一个 RichTextBox并且需要将其内容序列化到我的数据库中,纯粹是为了存储目的。看来我可以在序列化为 XAML 或 RTF 之间进行选择,并且想知道序列化为 XAML 是否比 RTF 有任何优势,我认为 RTF 更“标准”。

特别是,我是否会因为序列化为 RTF 而不是 XAML 而失去任何能力?我了解 XAML 支持 FlowDocument 中的自定义类,但我目前没有使用任何自定义类(尽管可扩展性的潜力可能足以成为使用 XAML 的理由)。

更新:我最终选择了 RTF,因为它支持文本编码的嵌入式图像。 XAML 似乎没有在其编码中包含图像数据,而 XamlPackage 编码为二进制,因此 RTF 对我来说效果更好。到目前为止,我还没有注意到任何能力不足。

最佳答案

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

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

  • block 可以有任意的 BorderBrush,包括带停止的渐变画笔,VisualBrush
  • Section 具有 HasTrailingParagraphBreakOnPaste 属性
  • Floater/ClearFloaters 的实现方式不同
  • 断字可以按 block 启用/禁用,而不仅仅是每个段落
  • WPF 样式和 ResourceDictionaries 可以包含在 Resources 属性中
  • 任意的 WPF UI,如绑定(bind)的 CheckBox 等,可以嵌入到 RichTextBox 中,并且可以从其他窗口剪切和粘贴。

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

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

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

    关于wpf - 将 WPF RichTextBox 序列化为 XAML 与 RTF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2946910/

    相关文章:

    c# - DataGrid 绑定(bind) - 不显示列表中的空条目

    c# - 如何从带有命名空间的xml中提取数据?

    python - 不可 JSON 序列化的项目的管道

    c# - 如何在新线程中调用长方法以保持 UI 在 C# 中运行

    wpf - 如何使用 VM 的数据绑定(bind)将简单的 wpf 标记提取到用户控件

    c# - 将 ListView 滚动到顶部 ItemsSource Changed 被意外调用

    c# - 如何以编程方式触发命令

    http - 有没有办法序列化golang http请求对象并持久保存在数据库中

    c# - 在 AvalonEdit 中像双击一样选择 Word

    wpf - 如何关闭 DrawingBrush 的抗锯齿功能?