保存包含图像和自定义令牌元素的 RichTextBox 内容
Save RichTextBox content containing both images and custom token elements
为如何成功保存和加载我的 System.Windows.Controls.RichTextBox 包含以下所有内容的内容而苦苦挣扎:格式化文本、图像、自定义类型定义的令牌元素、自定义动态令牌元素。
令牌元素是指我的自定义 类 继承自 System.Windows.Documents.Run,其中类型定义不需要记住任何动态设置的 属性 值(因为采取了行动基于加载后需要记住的类型)和动态的是这样的,还需要保留动态设置的属性(采取行动不仅基于类型,还基于这些设置值)。
我知道以下 3 种方法 save/load,但都不够:
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)。在此之前,我通过自定义 walker 遍历 FlowDocument,并将每个图像元素替换为自定义内联标记元素(与其他标记非常相似)。哈希 ID 作为 属性 分配给此替代元素,图像本身以哈希作为其文件名保存(用于识别图像文件的令牌)。图像与主文档(通过方法 (1) 保存)一起打包到一个文件中。
当加载所有东西时,包被解压,加载文档保持标记及其属性,并且替代图像元素被保存在包中的文件中的实际图像替换,再次使用前面提到的自定义 walker 和已建立哈希令牌-文件关系。
为如何成功保存和加载我的 System.Windows.Controls.RichTextBox 包含以下所有内容的内容而苦苦挣扎:格式化文本、图像、自定义类型定义的令牌元素、自定义动态令牌元素。
令牌元素是指我的自定义 类 继承自 System.Windows.Documents.Run,其中类型定义不需要记住任何动态设置的 属性 值(因为采取了行动基于加载后需要记住的类型)和动态的是这样的,还需要保留动态设置的属性(采取行动不仅基于类型,还基于这些设置值)。
我知道以下 3 种方法 save/load,但都不够:
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)。在此之前,我通过自定义 walker 遍历 FlowDocument,并将每个图像元素替换为自定义内联标记元素(与其他标记非常相似)。哈希 ID 作为 属性 分配给此替代元素,图像本身以哈希作为其文件名保存(用于识别图像文件的令牌)。图像与主文档(通过方法 (1) 保存)一起打包到一个文件中。
当加载所有东西时,包被解压,加载文档保持标记及其属性,并且替代图像元素被保存在包中的文件中的实际图像替换,再次使用前面提到的自定义 walker 和已建立哈希令牌-文件关系。