none
FlowDocument应该如何持久化 RRS feed

  • 问题

  • 从网上找了些例子,使用如下代码

                byte[] Stream;
                TextRange tr = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
                using (MemoryStream ms = new MemoryStream())
                {
                    tr.Save(ms, DataFormats.XamlPackage);
                    Stream = ms.ToArray();
                }
                rtb.Document.Blocks.Clear();
                using (MemoryStream ms = new MemoryStream(Stream))
                {
                    TextRange range = new TextRange(rtb.Document.ContentStart, rtb.Document.ContentEnd);
                    range.Load(ms, DataFormats.XamlPackage);
                }

    可以还原文字和嵌入图片

    不过InlineUIContainer和BlockUIContainer都丢失了

    请问用什么方法可以持久化完整的FlowDocument

    2012年5月17日 1:41

答案

全部回复

  • 补充:后来看到个XamlWriter / XamlReader的例子

                using (MemoryStream ms = new MemoryStream())
                {
                    XamlWriter.Save(rtb.Document, ms);
                    ms.Position = 0;
                    rtb.Document = (MyFlowDocument)XamlReader.Load(ms);
                }

    测试一下可以处理带Button的FlowDocument了,不过如果包含了自定控件,就报错了:

    “向类型为“System.Windows.ResourceDictionary”的字典中添加值引发了异常。”

    革命尚未成功。。。



    2012年5月17日 2:24
  • 看了http://msdn.microsoft.com/en-us/library/ms754193,然后用

    string s=XamlWriter.Save(rtb.Document,ms);
    Console.WriteLine(s);

    观察了一下自定义控件Save后的string(猜测Save成Stream也类似),确定自定义控件不能简单使用XamlWriter/XamlReader处理了

    新的思路是XamlWriter.Save前,先遍历Document,将自定义控件用标准控件替换掉,在标准控件中,想办法保存恢复时需要的数据(比如用Lable的Content保存GUID(或控件类型名)和必要参数),在XamlReader.Load后,再查找这些“替换控件”,根据保存的数据恢复真实控件


    • 已编辑 xiangl_hz 2012年5月17日 3:43
    • 已标记为答案 xiangl_hz 2012年5月18日 6:20
    2012年5月17日 3:42
  • 痛苦,原来以为很简单的控件替换,结果悲剧发现不知道该如何遍历修改ICollection<T>类(这里是InlineCollection和BlockCollection)

    foreach遍历是只读的,不能插入,删除,修改;又找不到别的遍历方法,不能用下标,没有Next方法。

    谁能帮帮我?或者我另开一贴醒目一点?


    2012年5月17日 10:19