3

我希望能夠將多個FlowDocuments存儲在每個文檔中的單個包中,包括圖像等。然而,我所見過的用於保存(和加載)Xaml FlowDocuments的方法似乎都無法做到這一點。從PackagePart(包括圖像等)序列化WPF FlowDocuments

  • TextRange.Save與DataFormats.Xaml條圖像和其它嵌入內容
  • TextRange.Save與DataFormats.XamlPackage創建了一個全新的包裝,而不是讓我來處理文檔,包括圖像作爲內零件包我會將它存儲在
  • XamlWriter看起來可能對此很好,但我無法弄清楚如何找到所有嵌入對象來放入它們自己的部分(儘管我當然知道如何處理它們一旦我找到他們)。另一方面,我不知道如何在以後正確加載所有內容。

很煩人的是,沒有一種將FlowDocument及其圖像等序列化到PackagePart的一站式方法。如果有人想出了這樣做的好方法,你是怎麼把它拉下來的?

更新2011-07-03 00:22:使用的XamlWriter和一些額外的代碼this question我已經能夠建立一個幸福的小OPC兼容包,它可以容納多個FlowDocuments包括他們的圖像,PackageParts。然而,走另一條路(從的PackagePart到FlowDocument的)失敗,因爲無論我怎麼嘗試加載該文件,我得到XamlParseExceptions告訴我,System.Windows.Media.Imaging

「初始化」。 BitmapImage'引發異常。'

因此,問題現在變成了,我該如何處理XamlReader.Load和/或我的部分流以便正確加載相關圖像?

回答

2

想通了。解決方案是在將其交給XamlReader之前手動處理Xaml文檔。圖像(以及作爲其自己的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。