x:Subclass ディレクティブ

x:Class も指定されている場合に、XAML のマークアップ コンパイルの動作を変更します。 x:Class に基づく部分クラスを作成する代わりに、指定した x:Class が中間クラスとして作成された後、x:Class に基づく指定した派生クラスが想定されます。

XAML 属性の使用方法

<object x:Class="namespace.classname" x:Subclass="subclassNamespace.subclassName">
   ...
</object>

XAML 値

説明
namespace 省略可能。 classname が含まれる CLR 名前空間を指定します。 namespace を指定する場合は、ドット (.) で namespaceclassname を区切ります。
classname 必須です。 読み込まれた XAML と、その XAML のコードビハインドを接続する、部分クラスの CLR 名を指定します。 「解説」を参照してください。
subclassNamespace 省略可能。 各名前空間で他を解決できる場合は、namespace と異なっていてもかまいません。 subclassName が含まれる CLR 名前空間を指定します。 subclassName を指定する場合は、ドット (.) で subclassNamespacesubclassName を区切ります。
subclassName 必須です。 サブクラスの CLR 名を指定します。

依存関係

同じオブジェクトで x:Class ディレクティブも指定する必要があり、そのオブジェクトは XAML の運用環境のルート要素である必要があります。

Remarks

x:Subclass を使用する主な目的は、言語で部分クラスの宣言がサポートされていない場合です。

x:Subclass として使用されるクラスを入れ子になったクラスにすることはできず、「依存関係」セクションで説明されているように、x:Subclass でルート オブジェクトを参照する必要があります。

そうでない場合、x:Subclass の概念上の意味は、.NET XAML サービスの実装によって定義されていません。 これは、.NET XAML サービスの動作で、XAML マークアップとバッキング コードの接続に使用される全体的なプログラミング モデルが指定されていないためです。 x:Classx:Subclass に関連するそれ以上の概念の実装は、プログラミング モデルまたはアプリケーション モデルを使用して、XAML マークアップ、コンパイル済みマークアップ、CLR ベースのコードビハインドを接続する方法を定義する特定のフレームワークによって実行されます。 フレームワークごとに独自のビルド アクションを使用して、ビルド環境に含まれる必要がある動作または特定のコンポーネントの一部を有効にすることができます。 フレームワーク内では、コードビハインドに使用される特定の CLR 言語に基づいて、ビルド アクションが異なる場合もあります。

WPF の使用上の注意

x:Subclass は、x:Class が既に存在するアプリケーション定義内のページ ルートまたは Application ルートに配置できます。 ページ ルートまたはアプリケーション ルート以外の要素で x:Subclass を宣言したり、x:Class が存在しない場所でそれを指定したりすると、コンパイル時エラーが発生します。

x:Subclass のシナリオで正しく動作する派生クラスを作成することは非常に複雑です。 中間ファイル (マークアップ コンパイルによってプロジェクトの obj フォルダーに生成される、名前に .xaml のファイル名が含まれる .g ファイル) の調査が必要になる場合があります。 これらの中間ファイルは、コンパイルされたアプリケーションの結合された部分クラスに含まれる特定のプログラミング コンストラクトの元の場所を特定するのに役立ちます。

コンパイルの間に中間クラスに作成されるハンドラーのスタブをオーバーライドするには、派生クラスのイベント ハンドラーが internal override (Microsoft Visual Basic では Friend Overrides) である必要があります。 そうでない場合は、派生クラスの実装によって中間クラスの実装が隠ぺい (シャドー化) され、中間クラスのハンドラーは呼び出されません。

x:Classx:Subclass の両方を定義する場合、x:Class によって参照されるクラスの実装を提供する必要はありません。 中間ファイルに作成されるクラスに関するガイダンスがコンパイラに提供されるように、x:Class 属性で名前を指定することだけが必要です (この場合、コンパイラで既定の名前は選択されません)。 x:Class クラスに実装を提供することはできますが、これは x:Classx:Subclass の両方を使用する場合の一般的なシナリオではありません。

関連項目