我希望能够在单个包中存储多个FlowDocuments,包括每个文档中的图像等。但是,我看到的用于保存(和加载)Xaml FlowDocuments的方法似乎都没有。
将一个FlowDocument及其图像等序列化到PackagePart没有一站式的方法,这真令人讨厌。如果有人想出一个很好的方法,你怎么把它拉下来?
更新2011-07-03 00:22:使用XamlWriter和this question的一些额外代码我已经能够构建一个快乐的小OPC兼容包,可以容纳多个FlowDocuments包括它们的图像,如PackageParts。但是,从另一个方向(从PackagePart到FlowDocument)失败,因为无论我如何尝试加载文档,我都会得到XamlParseExceptions告诉我
'System.Windows.Media.Imaging.BitmapImage'的初始化引发了异常。'
所以,问题现在变成了,我如何处理XamlReader.Load和/或我的部分流以便正确加载相关图像?
答案 0 :(得分:2)
想出来。解决方案是在将Xaml文档交给XamlReader之前手动处理它。图像(以及存储为其自己的PackageParts的其他元素)需要将BitmapImage.UriSource属性设置为包含包Uri(例如,在.Content/Document.xaml中的“./Image1.png”到“pack:// file” :,,, C:,项目,Package.pak /内容/ Image1.png“)
但有两点需要注意:
然而PackUriHelper.Create(Uri,Uri)
存在问题。而不是使用
PackUriHelper.Create(packUri, part.Uri))
你必须使用
new Uri(packUri.ToString() + value)
其中value
是part.Uri与初始/删除。如果你不这样做,而不是像上面那样获得一个正确的Uri,你会在包文件名之后得到一个额外的逗号,这会使XamlReader感到困惑和烦恼。
打开包时需要使用FileShare.Read,因为XamlReader会尝试自行打开它。默认情况下,Package.Open会锁定试图打开包的其他任何人,如果XamlReader.Load无法进入包本身,则会抛出WebException。