向/从PackagePart序列化WPF FlowDocuments(包括图像等)

时间:2011-07-03 03:00:48

标签: wpf xaml serialization flowdocument open-packaging-convention

我希望能够在单个包中存储多个FlowDocuments,包括每个文档中的图像等。但是,我看到的用于保存(和加载)Xaml FlowDocuments的方法似乎都没有。

  • TextRange.Save with DataFormats.Xaml剥离图像和其他嵌入内容
  • 带有DataFormats.XamlPackage的TextRange.Save创建了一个全新的包,而不是允许我将文档和包含的图像视为我将要存储在其中的包中的部分
  • XamlWriter看起来可能对此有好处,但我无法弄清楚如何找到所有嵌入对象以放入它们自己的部分(虽然我知道如何在找到它们后如何处理它们)。另一方面,我不知道如何在以后正确加载所有内容。

将一个FlowDocument及其图像等序列化到PackagePart没有一站式的方法,这真令人讨厌。如果有人想出一个很好的方法,你怎么把它拉下来?

更新2011-07-03 00:22:使用XamlWriter和this question的一些额外代码我已经能够构建一个快乐的小OPC兼容包,可以容纳多个FlowDocuments包括它们的图像,如PackageParts。但是,从另一个方向(从PackagePart到FlowDocument)失败,因为无论我如何尝试加载文档,我都会得到XamlParseExceptions告诉我

  

'System.Windows.Media.Imaging.BitmapImage'的初始化引发了异常。'

所以,问题现在变成了,我如何处理XamlReader.Load和/或我的部分流以便正确加载相关图像?

1 个答案:

答案 0 :(得分:2)

想出来。解决方案是在将Xaml文档交给XamlReader之前手动处理它。图像(以及存储为其自己的PackageParts的其他元素)需要将BitmapImage.UriSource属性设置为包含包Uri(例如,在.Content/Document.xaml中的“./Image1.png”到“pack:// file” :,,, C:,项目,Package.pak /内容/ Image1.png“)

但有两点需要注意:

  1. 然而PackUriHelper.Create(Uri,Uri)存在问题。而不是使用

    PackUriHelper.Create(packUri, part.Uri))
    

    你必须使用

    new Uri(packUri.ToString() + value)
    

    其中value是part.Uri与初始/删除。如果你不这样做,而不是像上面那样获得一个正确的Uri,你会在包文件名之后得到一个额外的逗号,这会使XamlReader感到困惑和烦恼。

  2. 打开包时需要使用FileShare.Read,因为XamlReader会尝试自行打开它。默认情况下,Package.Open会锁定试图打开包的其他任何人,如果XamlReader.Load无法进入包本身,则会抛出WebException。