次の方法で共有


既定の XAML スキーマ コンテキストと WPF XAML スキーマ コンテキスト

XAML スキーマ コンテキストは、特定の XAML ボキャブラリを使用する XAML の運用環境が、型マッピングの解決方法、アセンブリの読み込み方法、特定のリーダーおよびライター設定の解釈方法など、オブジェクトの書き込み動作と対話する方法を修飾する概念エンティティです。 このトピックでは、.NET XAML サービスの機能と、CLR 型システムに基づく、関連付けられている既定の XAML スキーマ コンテキストについて説明します。 このトピックでは、WPF に使用される XAML スキーマ コンテキストについても説明します。

既定の XAML スキーマ コンテキスト

.NET XAML サービスは、既定の XAML スキーマ コンテキストを実装し、使用します。 既定の XAML スキーマ コンテキストの動作は、XamlSchemaContext クラスの API で常に完全に表示されるとは限りません。 ただし、多くの場合、既定の XAML スキーマ コンテキストが影響する動作は、XamlMemberXamlTypeのメンバーなどの XAML 型システムの共通 API、または既定の XAML スキーマ コンテキストを使用する XAML リーダーと XAML ライターで公開されている API を通じて観察できます。

XamlSchemaContext コンストラクターを呼び出すことで、既定の動作をカプセル化する XamlSchemaContext を作成できます。 これにより、既定の XAML スキーマ コンテキストが明示的に作成されます。 XamlSchemaContext 入力パラメーターを明示的に受け取らない API を使用して XAML リーダーまたは XAML ライターを初期化すると、同じ既定の XAML スキーマ コンテキストが暗黙的に作成されます。

既定の XAML スキーマ コンテキストは、型マッピングの動作に CLR リフレクションに依存します。 これには、定義する CLR Type、および関連する PropertyInfo または MethodInfoの調査が含まれます。 また、型またはメンバーに対する CLR 属性は、CLR バッキング型を使用する XAML 型または XAML メンバー情報の詳細を入力するために使用されます。 既定の XAML スキーマ コンテキストでは、CLR 型システムから必要な情報を入手できるため、Invoker パターンなどの型システム拡張手法は必要ありません。

アセンブリ読み込みロジックの場合、既定の XAML スキーマ コンテキストは、主に XAML 名前空間マッピングで提供されるすべてのアセンブリ値に依存します。 また、LocalAssembly は、内部型の読み込みなどのシナリオで、読み込むアセンブリをヒントにすることができます。

WPF XAML スキーマ コンテキスト

WPF の実装は、既定以外の XAML スキーマ コンテキストを実装することによって導入できる機能の種類の興味深い図を提供するため、このトピックでは WPF XAML スキーマ コンテキストについて説明します。 また、XAML スキーマ コンテキストの概念については、WPF XAML に対応する WPF ドキュメントではあまり説明されていません。XAML スキーマ コンテキストが有効にする動作は、既定の XAML スキーマ コンテキストのしくみの説明と統合されている場合にのみ、完全に理解できる可能性があります。 WPF XAML スキーマ コンテキストは、次の動作を実装します。

参照のオーバーライド: WPF には XAML 用のいくつかのコンテンツ モデルがあり、属性付けされずに機能する XAML コンテンツ プロパティ ContentPropertyAttribute 存在します。 WPF の LookupContentProperty オーバーライドは、この動作を実装します。

WPF 式の遅延: WPF には、ランタイム コンテキストが使用可能になるまで値を延期するいくつかの式クラスが用意されています。 また、テンプレートの拡張は、遅延手法に依存するランタイム動作です。

型システム参照の最適化: WPF には、数百個の WPF 定義クラスを継承する基底クラスメンバー定義を含む、広範な XAML ボキャブラリとオブジェクト モデルがあります。 また、WPF 自体は複数のアセンブリに分散されます。 WPF では、参照テーブルやその他の手法を使用して、型参照が最適化されます。 これにより、既定の XAML スキーマ コンテキストとその CLR ベースの型参照に対するパフォーマンスが向上します。 ルックアップ テーブルに型が存在しない場合、動作では、既定の XAML スキーマ コンテキストに似た XAML スキーマ コンテキスト手法が使用されます。

XamlType および XamlMember 拡張機能 : WPF では、依存関係プロパティを使用してプロパティの概念を拡張し、ルーティング イベントを使用したイベントの概念を拡張します。 これらの概念を XAML 処理操作の可視性を高めるために、WPF は XamlTypeXamlMemberを拡張し、依存関係プロパティとルーティング イベントの特性を報告する内部プロパティを追加します。

WPF XAML スキーマ コンテキストへのアクセス

WPF System.Windows.Markup.XamlReader または System.Windows.Markup.XamlWriterに基づく XAML 手法を使用している場合、WPF XAML スキーマ コンテキストは、これらの XAML リーダーおよび XAML ライターの実装で既に使用されています。

WPF XAML スキーマ コンテキストで初期化されない他の XAML リーダーまたは XAML ライターの実装を使用している場合は、XamlReader.GetWpfSchemaContextから動作する WPF XAML スキーマ コンテキストを取得できる場合があります。 その後、この値を、XamlSchemaContextを使用する他の API の初期化として使用できます。 たとえば、初期化のために XamlXmlReader を呼び出し、WPF XAML スキーマ コンテキストを渡すことができます。 または、XAML 型システム操作に WPF XAML スキーマ コンテキストを使用することもできます。 これには、XamlType または XamlMemberの構築の初期化、または XamlSchemaContext.GetXamlTypeの呼び出しが含まれる場合があります。

純粋な XAML ノード ストリームの観点から WPF XAML の特定の側面にアクセスする場合、WPF フレームワーク機能の一部がまだ機能していない可能性があることに注意してください。 たとえば、コントロールの WPF テンプレートはまだ適用されていません。 したがって、実行時に完全なビジュアル ツリーが設定される可能性があるプロパティにアクセスすると、テンプレートを参照するプロパティ値のみが表示されることがあります。 WPF マークアップ拡張に対して提供されるサービス コンテキストは、実行時以外の状況から提供された場合も正確ではない可能性があり、オブジェクト グラフを書き込もうとしたときに例外が発生する可能性があります。

XAML とアセンブリの読み込み

XAML および .NET XAML サービスのアセンブリ読み込みでは、CLR で定義された AppDomainの概念と統合されます。 XAML スキーマ コンテキストは、AppDomain やその他の要因の使用に基づいて、実行時またはデザイン時にアセンブリを読み込むか、型を検索する方法を解釈します。 ロジックは、XAML リーダーの XAML が緩い XAML であるか、XAML が XamlBuildTaskによって DLL にコンパイルされるか、WPF の PresentationBuildTaskによって BAML が生成されるかによって若干異なります。

WPF の XAML スキーマ コンテキストは、WPF アプリケーション モデルと統合され、AppDomain と WPF 実装の詳細であるその他の要因が使用されます。

XAML リーダー入力 (ルーズ XAML)

  1. XAML スキーマ コンテキストは、アプリケーションの AppDomain を反復処理し、最後に読み込まれたアセンブリから開始して、名前のすべての側面に一致する既に読み込まれているアセンブリを探します。 一致するものが見つかった場合、そのアセンブリは解決に使用されます。

  2. それ以外の場合は、CLR Assembly API に基づく次のいずれかの手法を使用してアセンブリを読み込みます。

    • マッピングで名前が修飾されている場合は、修飾名に対して Assembly.Load(String) を呼び出します。

    • 前の手順で失敗した場合は、短い名前 (存在する場合は公開キー トークン) を使用して Assembly.Load(String)を呼び出します。

    • マッピングで名前が修飾されていない場合は、Assembly.LoadWithPartialNameを呼び出します。

XamlBuildTask

XamlBuildTask は、Windows Communication Foundation (WCF) と Windows Workflow Foundation に使用されます。

XamlBuildTask を介したアセンブリ参照は常に完全修飾されることに注意してください。

  1. 修飾名の Assembly.Load(String) を呼び出します。

  2. 前の手順で失敗した場合は、短い名前 (存在する場合は公開キー トークン) を使用して Assembly.Load(String)を呼び出します。

BAML (PresentationBuildTask)

BAML のアセンブリ読み込みには、BAML をコンポーネントとして含む初期アセンブリの読み込みと、BAML 実稼働で参照される任意の型の型バッキング アセンブリの読み込みの 2 つの側面があります。

初期マークアップのアセンブリ読み込み:

マークアップを読み込むアセンブリへの参照は、常に修飾解除されます。

  1. WPF XAML スキーマ コンテキストは、WPF アプリケーションの AppDomain を反復処理し、最後に読み込まれたアセンブリから開始して、名前のすべての側面に一致する既に読み込まれているアセンブリを探します。 一致するものが見つかった場合、そのアセンブリは解決に使用されます。

  2. 前の手順で失敗した場合は、短い名前 (存在する場合は公開キー トークン) を使用して Assembly.Load(String)を呼び出します。

BAML 型によるアセンブリ参照:

BAML 運用で使用される型のアセンブリ参照は、ビルド タスクの出力として常に完全修飾されます。

  1. WPF XAML スキーマ コンテキストは、WPF アプリケーションの AppDomain を反復処理し、最後に読み込まれたアセンブリから開始して、名前のすべての側面に一致する既に読み込まれているアセンブリを探します。 一致するものが見つかった場合、そのアセンブリは解決に使用されます。

  2. それ以外の場合は、次のいずれかの手法を使用してアセンブリを読み込みます。

    • 修飾名の Assembly.Load(String) を呼び出します。

    • 短い名前と公開キー トークンの組み合わせが、BAML が読み込まれたアセンブリと一致する場合は、そのアセンブリを使用します。

    • Assembly.Load(String)を呼び出すには、短い名前と公開キー トークンを使用します。

関連項目