【问题标题】:Save RichTextBox content containing both images and custom token elements保存包含图像和自定义标记元素的 RichTextBox 内容
【发布时间】:2018-10-12 19:07:09
【问题描述】:

苦于如何成功保存和加载包含以下所有内容的 System.Windows.Controls.RichTextBox 内容:格式化文本、图像、自定义类型定义的标记元素、自定义动态标记元素。

通过令牌元素,我的意思是我的自定义类继承自 System.Windows.Documents.Run,​​其中类型定义不需要记住任何动态设置的属性值(因为根据需要执行的类型执行操作加载后记住)和动态的也需要保留动态设置的属性(动作不仅基于类型,还基于这些设置值)。

我知道以下 3 种保存/加载方法,但都不够:

1)

string xamlStream = System.Windows.Markup.XamlWriter.Save(myRichTxtBx.Document);

然后保存字符串

2)

TextRange content = new TextRange(myRichTxtBx.Document.ContentStart, myRichTxtBx.Document.ContentEnd);
content.Save(myFileStream, DataFormats.XamlPackage, true);

3)

TextRange content = new TextRange(myRichTxtBx.Document.ContentStart, myRichTxtBx.Document.ContentEnd);
content.Save(myFileStream, DataFormats.Xaml, true);

这些是那些问题:

1) 重启应用后无法加载图片(但记得属性)

2) 不记得属性(但重启应用后能够加载图像)

3) 即使在同一个应用实例中也不会加载图像,也不记得属性值

我只能找到解决图像保存问题 (2) 或属性问题 (1) 的答案,但不能同时解决这两个问题。

目标是拥有一个可标记的 RichTextBox,其中标记要么被基于提供的 ORM 对象(= 类型定义的标记)的数据库中的值替换,要么由用户再次基于提供的 ORM 对象动态设置值.

【问题讨论】:

    标签: c# serialization richtextbox flowdocument


    【解决方案1】:

    我已经通过一个非常丑陋的解决方法解决了这个问题:

    为了保存文档,我使用上述方法 (1)。在此之前,我通过自定义 walker 遍历 FlowDocument 并将每个图像元素替换为自定义内联标记元素(很像其他标记)。散列 ID 作为属性分配给该替代元素,并且图像本身以散列作为其文件名保存(用于识别图像文件的令牌)。图片与主文档(由方法(1)保存)一起打包到一个文件中。

    当重新加载所有内容时,包被解包,加载的文档保持令牌及其属性和替代图像元素被保存在包中的文件中的实际图像替换,再次使用前面提到的自定义 walker 和已建立的哈希令牌文件关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      相关资源
      最近更新 更多