XAMLServices クラスおよび基本的な XAML の読み取りまたは書き込み

XamlServices は、XAML ノード ストリーム、またはこれらのノードから取得された XAML 型システム情報への固有のアクセスを必要としない XAML シナリオに対応するために使用できる、.NET によって提供されるクラスです。 XamlServices API は次のようにまとめることができます。XAML の読み込みパスをサポートする Load または Parse、XAML の保存パスをサポートする Save、読み込みパスと保存パスを結合する手法を提供する TransformTransform は、XAML スキーマを別の XAML スキーマに変更するために使用できます。 このトピックでは、それぞれの API 分類について要約し、特定のメソッド オーバーロード間の相違点について説明します。

[読み込み]

Load のさまざまなオーバーロードは、読み込みパスのロジック全体を実装しています。 読み込みパスは、ある形式の XAML を使用して XAML ノード ストリームを出力します。 これらの読み込みパスのほとんどは、エンコードされた XML テキスト ファイル形式で XAML を使用します。 ただし、一般的なストリームを読み込むことも、異なる XamlReader 実装に既に含まれているプリロード済みの XAML ソースを読み込むこともできます。

ほとんどのシナリオにおいて最もシンプルなオーバーロードは、 Load(String)です。 このオーバーロードには、読み込まれる XAML を含むテキスト ファイル名を表す fileName パラメーターがあります。 これは、以前にローカル コンピューターに対してシリアル化された状態またはデータを持つ、完全信頼アプリケーションなどのアプリケーション シナリオに適しています。 また、アプリケーション モデル (フレームワーク) を定義している場合に、アプリケーションの動作、開始 UI、またはフレームワークによって定義された XAML を使用するその他の機能を定義した標準ファイルの 1 つを読み込む場合にも便利です。

Load(Stream) にも、類似したシナリオがあります。 Stream はファイル システムにアクセスできるその他の System.IO API の出力として頻繁に使用されるため、読み込むファイルをユーザーが選択できるようにする場合は、このオーバーロードが便利です。 または、非同期ダウンロードや、ストリームを生成するその他のネットワーク技術を使用して XAML ソースにアクセスすることもできます。 (ストリームまたはユーザーが選んだソースから読み込むと、セキュリティに影響する可能性があります。詳細については、「XAML セキュリティの考慮事項」を参照してください。)

Load(TextReader)Load(XmlReader) は、前のバージョンの .NET の形式のリーダーに依存するオーバーロードです。 これらのオーバーロードを使用するには、あらかじめリーダー インスタンスを作成し、その Create API を使用して XAML を関連形式 (テキストまたは XML) に読み込む必要があります。 レコード ポインターを他のリーダーに既に移動したり、またはレコード ポインターを使用して他の操作を実行したりした場合でも、そのことは問題になりません。 Load からの読み込みパス ロジックは、常にルート以下の XAML 入力全体を処理します。 以下のシナリオでは、これらのオーバーロードの使用が保証されている場合があります。

  • 既存の XML 用テキスト エディターを利用してシンプルな XAML 編集機能を提供するデザイン サーフェイス。

  • 専用のリーダーを使用してファイルまたはストリームを開く、コア System.IO の派生シナリオ。 XAML として読み込む前に、コンテンツの基本的なチェックや処理をロジックで実行します。

ファイルまたはストリームを読み込むか、リーダーの API を使用して読み込むことにより XAML の入力をラップする XmlReaderTextReader、または XamlReader を読み込むことができます。

内部的には、上に示した各オーバーロードは最終的に Load(XmlReader)になり、渡された XmlReader は新しい XamlXmlReaderを作成するために使用されます。

より高度なシナリオを提供する Load シグネチャは Load(XamlReader)です。 このシグネチャは、次のいずれかのケースで使用できます。

  • XamlReader の独自の実装を定義した場合。

  • 既定の設定とは異なる設定を XamlReader に指定する必要がある場合。

既定以外の設定の例:

AllowProtectedMembersOnRoot
BaseUri
IgnoreUidsOnPropertyElements
LocalAssembly
ValuesMustBeString

XamlServices の既定のリーダーは XamlXmlReaderです。 設定で独自の XamlXmlReader を提供する場合は、次のプロパティが既定値以外の XamlXmlReaderSettings に設定されます。

CloseInput
SkipXmlCompatibilityProcessing
XmlLang
XmlSpacePreserve

[解析]

Parse は、XAML 入力から XAML ノード ストリームを作成する読み込みパス API であるため、 Load に似ています。 ただし、この場合の XAML 入力は、読み込まれる XAML 全体を含む文字列として直接指定されます。 Parse は軽量のアプローチであり、フレームワーク シナリオよりもアプリケーション シナリオにより適しています 詳細については、「Parse」を参照してください。 Parse は、内部に StringReader が含まれるラップされた Load(XmlReader) の呼び出しに過ぎません。

保存

Save のさまざまなオーバーロードでは、保存パスが実装されています。 どの Save メソッドもオブジェクト グラフを入力として取り、ストリーム、ファイル、または XmlWriter/TextWriter インスタンスとして出力を生成します。

入力オブジェクトは、何らかのオブジェクト表現のルート オブジェクトであると想定されます。 ビジネス オブジェクトの単一ルート、UI シナリオでのページのオブジェクト ツリーのルート、デザイン ツールの作業用の編集サーフェイス、またはシナリオに適したその他のルート オブジェクト概念などが考えられます。

多くのシナリオでは、保存されるオブジェクト ツリーは、Load を使用するか、フレームワークまたはアプリケーション モデルによって実装された他の API を使用して XAML を読み込んだ、元の操作に関連しています。 状態の変更、アプリケーションがユーザーからキャプチャしたランタイム設定の変更、アプリケーションが XAML デザイン サーフェイスであるために発生する XAML の変更などにより、キャプチャされるオブジェクト ツリーに相違が生じることもあります。変更の有無にかかわらず、まずマークアップから XAML を読み込んで再保存し、2 つの XAML マークアップ フォームを比較するという概念は、XAML のラウンド トリップ表現と呼ばれることがあります。

マークアップ形式で設定された複合オブジェクトの保存とシリアル化に伴う課題は、完全な表現によって情報を失われないようにすることと、XAML が詳細すぎてユーザーが判読しにくい状態になることとの間のバランスを取ることです。 さらに、XAML を使用する顧客が異なれば、このバランスをどのように取るかの定義や要求も異なることがあります Save API は、このバランスの定義の 1 つを表します。 Save は、使用できる XAML スキーマ コンテキストと、 XamlTypeXamlMemberの既定の CLR ベースの特性、およびその他の組み込み XAML と XAML 型システムの概念を使用し、ある XAML ノード ストリーム構造をマークアップに再保存するときに、どこで最適化するかを決定します。 たとえば、 XamlServices の保存パスでは、CLR ベースの既定の XAML スキーマ コンテキストを使用してオブジェクトの XamlType を解決し、 XamlType.ContentPropertyを決定したうえで、このオブジェクトの XAML コンテンツにプロパティを記述するときにプロパティ要素タグを省略できます。

Transform

Transform は、読み込みパスと保存パスを単一の操作としてリンクすることによって、XAML を変換します。 XamlReader および XamlWriterに対して異なるスキーマ コンテキストまたは異なるバッキング型システムを使用できます。これは、結果として生成される XAML がどのように変換されるかに影響します。 これは、さまざまな変換操作で機能します。

XAML ノード ストリームの各ノードの確認に依存する操作については、通常、 Transformは使用しません。 代わりに、読み込みパスから保存パスへの一連の操作を独自に定義し、独自のロジックを挿入する必要があります。 たとえば、独自のノード ループの中で XAML リーダーと XAML ライターのペアを使用します。 具体的に言うと、 XamlXmlReader を使用して最初の XAML を読み込み、 Read を連続的に呼び出してノードにステップ インします。 XAML ノード ストリーム レベルの操作では、個々のノード (型、メンバー、その他のノード) を調整して変換を適用するか、ノードをそのままにしておくことができます。 その後、ノードを Write の関連する XamlObjectWriter API に送り、オブジェクトを書き込みます。 詳細については、「 Understanding XAML Node Stream Structures and Concepts」を参照してください。

関連項目