XamlWriter.Save のシリアル化の制限

更新 : 2007 年 11 月

API Save を使用して、Windows Presentation Foundation (WPF) アプリケーションの内容を Extensible Application Markup Language (XAML) ファイルとしてシリアル化できます。ただし、シリアル化される対象には注意すべき制限がいくつかあります。このトピックでは、これらの制限と全般的な考慮事項をいくつか説明します。

このトピックには次のセクションが含まれています。

  • ランタイム (非デザイン タイム) 表現
  • シリアル化の内部格納
  • 拡張参照の参照解除
  • 保持されないイベント処理
  • XAMLWriter.Save を使用するための現実的なシナリオ

ランタイム (非デザイン タイム) 表現

Save の呼び出しによるシリアル化の基本概念は、実行時にシリアル化されているオブジェクトが結果として表れることです。元の XAML ファイルのデザイン タイム プロパティの多くは、XAMLがメモリ内オブジェクトとして読み込まれる時点で既に最適化されているか、失われている可能性があり、シリアル化するためにSaveを呼び出したときには保持されていません。シリアル化された結果は、アプリケーションの構築された論理ツリーを効率的に表していますが、必ずしも、これを生成した元の XAML のものではありません。これらの問題により、広範な XAML デザイン サーフェイスの一部として Save のシリアル化を使用することが極めて困難になります。

シリアル化の内部格納

Save のシリアル化された出力は内部格納されます。つまり、シリアル化されたものはすべて、単一ルート要素と共に XAML の単一ページ内に含まれ、URI 以外による外部参照はされません。たとえば、ページがアプリケーション リソースからリソースを参照した場合、これらのリソースは、シリアル化されているページのコンポーネントであるかのように表示されます。

拡張参照の参照解除

さまざまなマークアップ エクステンション形式によって作成されたオブジェクトの一般的な参照 (StaticResource、Binding など) は、シリアル化プロセスによって参照解除されます。これらは、メモリ内のオブジェクトがアプリケーション ランタイムによって作成された時点で既に参照解除されており、Save ロジックは、このようなシリアル化された出力の参照を復元するために、元の XAML を再確認することはありません。これにより、データ バインディングされた値または取得されたリソース値はすべて、ランタイム表現により前回使用された値に潜在的に固定され、ローカルに設定された他の値とこのような値を区別するための限定的または間接的な機能だけを持ちます。また、プロジェクト内にイメージが存在するので、イメージも、元のソース参照としてではなくイメージへのオブジェクト参照としてシリアル化され、元々参照されていたいかなるファイル名または URI も失われます。同一ページ内で宣言されたリソースも、これらが参照されたポイントにシリアル化され、リソース コレクションのキーとしては保持されません。

保持されないイベント処理

XAML を介して追加されたイベント ハンドラがシリアル化されない場合、これらは保持されません。分離コード (および関連 x:Code 機能) を持たない XAML は、ランタイム手続きロジックをシリアル化する方法がありません。シリアル化は内蔵されていて、論理ツリーに制限されているため、イベント ハンドラを格納するための機能がありません。その結果、イベント ハンドラ属性 (属性自体とハンドラの名前を表す文字列共) は、出力 XAML から削除されます。

XAMLWriter.Save を使用するための現実的なシナリオ

ここに示された制限は相当な量ですが、Save をシリアル化に使用するための適切なシナリオがいくつかあります。

  • ベクタまたはグラフィカル出力 : レンダリングされた領域の出力を使用して、再読み込みの際に同じベクタまたはグラフィックスを再現できます。

  • リッチ テキストとフロー ドキュメント : テキストと要素の書式およびその中に含まれる要素のコンテインメントはすべて、出力に保持されます。これは、クリップボードに近似した機能に役立つ場合があります。

  • ビジネス オブジェクト データの保持 : ビジネス オブジェクトが基本的な XAML 規則 (カスタム コンストラクタと変換に対し参照ごとのプロパティ値を提供する、など) に従う限り、XML データなどのデータをカスタム要素に格納した場合、これらのビジネス オブジェクトはシリアル化によって永続的なものになります。