3

各ドキュメント内の画像などを含めて、複数の FlowDocument を 1 つのパッケージ内に格納できるようにしたいと考えています。ただし、Xaml FlowDocuments を保存 (および読み込み) するために私が見た方法はどれもこれに対応していないようです。

  • DataFormats.Xaml を使用した TextRange.Save は、画像やその他の埋め込みコンテンツを取り除きます
  • TextRange.Save with DataFormats.XamlPackage は、ドキュメントと含まれる画像を、保存するパッケージ内の一部として扱うのではなく、まったく新しいパッケージを作成します。
  • XamlWriter はこれに適しているように見えますが、独自のパーツを配置するためのすべての埋め込みオブジェクトを見つける方法がわかりません (見つけたら、それらを処理する方法は確かに知っています)。一方で、後ですべてを適切にロードする方法がわかりません。

FlowDocument とその画像などを PackagePart にシリアル化するためのワンストップの方法がないのは、かなり面倒です。誰かがこれを行う良い方法を考え出した場合、どのようにそれをやってのけたのですか?

UPDATE 2011-07-03 00:22: XamlWriterとこの質問の追加コードを使用して、PackageParts として画像を含む複数の FlowDocuments を保持できる、小さな OPC 準拠のパッケージを作成できました。ただし、他の方法 (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")。

ただし、次の 2 つの注意事項があります。

  1. ただし、問題がありPackUriHelper.Create(Uri,Uri)ます。使用する代わりに

    PackUriHelper.Create(packUri, part.Uri))
    

    使用する必要があります

    new Uri(packUri.ToString() + value)
    

    part.Urivalueは頭文字 / を削除した場所です。これを行わないと、上記のように適切な Uri を取得する代わりに、パッケージ ファイル名の後にカンマが追加されたものを取得することになり、XamlReader が混乱して困惑します。

  2. XamlReader がそれ自体を開こうとするため、パッケージを開くときに FileShare.Read を使用する必要があります。既定では、Package.Open はパッケージを開こうとする他のユーザーをロックアウトし、XamlReader.Load がパッケージ自体にアクセスできない場合は WebException をスローします。

于 2011-07-03T06:03:46.617 に答える