保存同时包含图像和自定义标记元素的RichTextBox内容

时间:2018-07-12 19:57:09

标签: c# serialization richtextbox flowdocument

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

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

我知道以下三种保存/加载方法,但这两种方法都不足够:

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对象动态设置值

1 个答案:

答案 0 :(得分:0)

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

要保存文档,我使用上述方法(1)。在此之前,我通过自定义遍历器遍历FlowDocument,并用自定义内嵌标记元素替换每个图像元素(与其他标记非常相似)。哈希ID被分配为该替换元素的属性,并且以哈希作为文件名保存图像本身(用于与图像文件一起标识令牌)。图像和主文档(通过方法(1)保存)一起打包到一个文件中。

将所有内容重新装回时,将打开包装,加载包含令牌及其属性和替换图像元素的文档,并再次使用上述自定义walker和已建立的哈希替换包装中保存的文件中的实际图像令牌文件关系。