次の方法で共有


XAML パーサー アーキテクチャ

WPF Designer for Visual Studio は XAML (Extensible Application Markup Language) ドキュメントを読み込み、Visual Studio 上で表示される WPF オブジェクトを作成します。 読み込み時に発生するエラーは、[エラー一覧] ウィンドウに表示されます。

XAML 読み込みフェーズ

WPF デザイナー は XAML ドキュメントを読み込んで、対応する抽象構文ツリー (AST: Abstract Syntax Tree) を作成します。 AST は、解析された XAML を表すデータ構造です。 これは、ラベルが付いた、有向、有限のツリーで、内部ノードは演算子によってラベルが付けられ、リーフ ノードは、ノード演算子のオペランドを表します。 リーフ ノードは、引数がない演算子、つまり変数または定数を持ちます。

XAML ドキュメントの読み込みは、次の表に示す一連のフェーズで段階的に行われます。

XAML 読み込みフェーズ

説明

XML 構文の検証

スキャナー: 構文に準拠していない箇所、無効な文字をチェックし、構文トークンを作成します。

パーサー: AST を作成し、タグが整形式であり対になっているかどうかを確認します。

XAML 構文の検証

ConvertToXaml がすべての型を検索し、型情報を XAML AST に入力し、XAML AST に注釈を加えます。

Validate がエラー チェックを行い、ツリー内のノードの位置を確認します。

モデルとオブジェクトのインスタンス化

他の 2 つのフェーズとは異なる方法で AST を検証し、編集モデルと WPF オブジェクトを作成します。

前のフェーズでエラーが検出されたノードはエラーありとしてマークされ、以降のフェーズではスキップされます。 スキャナー フェーズとパーサー フェーズでエラーが検出されると、モデルとオブジェクトのインスタンス化フェーズは実行されません。

XML 構文の検証

スキャナー フェーズとパーサー フェーズで、読み込むドキュメントが、XML 構文エラーのない、整形式の XML ドキュメントかどうかが検証されます。 XML 構文エラーの例としては、対応する </Button> 終了タグのない <Button> タグなどがあります。 パーサーは、エラーの回復を試みます。このため、1 回のドキュメントの解析から複数のエラーが報告されることがあります。

XAML 構文の検証

パーサーは別個のパスで XML AST を走査し、ドキュメントが有効な XAML ドキュメントであること、つまり、ドキュメントが XAML スキーマに準拠し、無効な XAML を含んでいないことをチェックします。 無効な XAML の例としては、<Button SomeProperty="Mark"> など、無効なプロパティ宣言が使用された要素があります。

これらのパスには型の解決も含まれ、要素名やプロパティ名などの情報がその要素型に対して有効であることも検証されます。 たとえば、パーサーは、SomeProperty が Button のプロパティであるかどうかをチェックします。 型の不一致はエラーになります。

パーサーは、エラーの回復を試みます。このため、1 回のドキュメントの解析から複数のエラーが報告されることがあります。 ただし、すべてのエラーが報告されるわけではありません。 たとえば、要素名のスペルが間違っており、その要素内のプロパティ名のスペルも間違っている場合、要素名のエラーのみが最初に報告されます。これは、要素名が解決されるまで、プロパティ名の検証は行われないためです。

注意

このフェーズでは、プロパティ値は検証されません。 たとえば、このフェーズでは <Button Background="xBlue"/> は検出されません。 このトピックの下記の内容を参照してください。

モデルとオブジェクトのインスタンス化

構文検証の最後には、AST のビューまたはカーソルとして機能する XAML 固有のドキュメント ツリーである XAML 対応の AST があります。

最後のフェーズでは、モデルとその基になるインスタンスがインスタンス化され、プロパティ値が文字列から変換され割り当てられます。 パーサーは、ドキュメント ツリー マネージャー クラスを使用してドキュメント ツリーを作成することによって、これを行います。 XAML に対してドキュメント ツリーが作成されると、基になる WPF インスタンスも作成されます。 これらのインスタンスは、デザイナーのビューとして使用されます。

モデルとインスタンスの作成時に例外が発生した場合、エラーが発生したノードの子のオブジェクトは作成されません。 ツリーの残りの部分についてのモデルが作成されます。 これにより、エラーは可能な限り多く検出されることになります。

たとえば、コード片 <Button Background="Test"/> では、Brush 型の TypeConverter は Test を Brush インスタンスに変換しようとします。 Test は有効な Brush 値でないため、型コンバーターは例外を発生し、これにより、子ノードの解析処理が停止します。ただし、この例外は、ドキュメントの残りの部分の解析には影響しません。

プロパティ値は、これを所有するオブジェクトがインスタンス化されるときに文字列から変換されます。 これは、所有するオブジェクトがデザイン サーフェイス上で使用されるときに発生します。 多くの値範囲エラーは、親オブジェクトがデザイナーで使用されるまで報告されません。

この動作は WPF コンパイルに似ています。 WPF コンパイラは、コンパイル中に属性 (プロパティ) 値の検証または変換を行いません。 型コンバーターは、実行時にオブジェクト ツリーが WPF によってインスタンス化されるまで呼び出されません。

注意

外部リソース ディクショナリを読み込む際には、編集モデルとパーサー間で対話が行われます。 編集モデルが追加 XAML ファイルを読み込む必要がある場合に、XAML 読み込み操作がトリガーされます。

エラー メッセージ

WPF デザイナー エラー メッセージのヘルプ トピックから、どの XAML 読み込みフェーズでエラーが発生したかわかります。 メッセージとフェーズとの関係を次の表に示します。

XAML 読み込みフェーズ

エラー メッセージ

XML 構文の検証

このエラーは、XAML ファイルが整形式の XML ドキュメントではない場合に発生します。

XAML 構文の検証

このエラーは、ファイルが有効な XML ドキュメントであるが、整形式の XAML ドキュメントでない場合に発生します。

モデルとオブジェクトのインスタンス化

このエラーは、ファイルが有効な XAML ドキュメントであるが、1 つ以上の型の不一致がある場合に発生します。

参照

概念

XAML エラーとヘルプ

その他の技術情報

WPF デザイナーのエラー メッセージ

WPF の XAML