3

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

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

没有将 FlowDocument 及其图像等序列化到 PackagePart 的一站式方法,这很烦人。如果有人想出了这样做的好方法,你是怎么做到的?

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

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

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

4

1 回答 1

2

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

但是有两个警告:

  1. 然而有一个问题PackUriHelper.Create(Uri,Uri)。而不是使用

    PackUriHelper.Create(packUri, part.Uri))
    

    你必须使用

    new Uri(packUri.ToString() + value)
    

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

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

于 2011-07-03T06:03:46.617 回答