x:Name 属性
更新 : 2007 年 11 月
分離コードまたは一般的なコードからインスタンス化された要素へのアクセスを目的として、オブジェクト要素を一意に識別します。基になるプログラミング モデルに適用後の x:Name は、コンストラクタによって返されるオブジェクト参照を保持する変数と等価と見なすことができます。
XAML 属性の使用方法
<object x:Name="XAMLNameValue".../>
XAML 値
XAMLNameValue |
XamlName の文法の制限に準拠する文字列。 |
解説
WPF アプリケーション プロジェクトの標準のビルド構成では、XAML、部分クラス、および分離コードを使用します。ここで指定した x:Name は、XAML の処理時に、基になるコードで生成されるフィールドの名前となり、そのフィールドはオブジェクトへの参照を保持します。
既定では、作成されたフィールドは内部型です。x:FieldModifier 属性を指定することによって、フィールド アクセスを変更できます。
Microsoft Visual Basic .NET を使用するアプリケーションは XAML ファイルをターゲットにして含むため、個別の参照プロパティはコンパイル時に作成されます。このコンパイルでは、x:Name を持つすべての要素に WithEvents キーワードが追加され、イベント ハンドラ デリゲートの Handles 構文をサポートします。このプロパティは常にパブリックです。詳細については、「Visual Basic と WPF のイベント処理」を参照してください。
x:Name は名前スコープ内で一意である必要があります。一般的な XAML の場合、単一の XAML ページに含まれる要素によってプライマリ名前スコープが定義されます。それ以外の異なる名前スコープは、やはりそのページで定義されるテンプレートによって定義されます。名前スコープの考慮事項の詳細については、「WPF 名前スコープ」を参照してください。
x:Name を使用して、XAML プロセッサは名前を名前スコープに登録します。これは、そのページがコンパイルされない場合 (たとえば、Loose XAML) にも当てはまります。これは、ElementName バインディングに x:Name が必要になる場合があるためです。詳細については、「データ バインディングの概要」を参照してください。
x:Name は、WPF プログラミングの一部のスコープでは適用できません。たとえば、ResourceDictionary 内の項目に名前を付けることはできません。これは、ResourceDictionary が自らを XAML 名前スコープと定義するにもかかわらず、主要な INameScope API については Not Implemented を返すという特殊な動作をするためです。
一意のスコープおよび x:Name の許可に関するルールは、さまざまなマークアップ要素を個別の NameScope 範囲 (リソース ディクショナリ、ページ レベルの XAML によって作成された論理ツリー、テンプレートなど) に分ける基底の Windows Presentation Foundation (WPF) フレームワーク実装によって定義されます。
x:Name 属性をまったく使用せずに済む WPF フレームワーク レベルのアプリケーションもあります。これは、FrameworkElement/FrameworkContentElement などのいくつかの重要な基本クラスの WPF 名前空間内で指定される Name 依存関係プロパティが、同じ機能を満たすからです。それでも、Name プロパティのない要素へのコード アクセスが必要となる XAML およびフレームワークの一般的なシナリオもあります。一部のアニメーション サポート クラスおよびストーリーボード サポート クラスの場合が顕著な例です。たとえば、XAML で作成するタイムラインと変換をコードから参照するには、これらに x:Name を指定する必要があります。
Name をクラスのプロパティとして使用できる場合、Name と x:Name のどちらも属性として使用できますが、両方を同じ要素で指定するとエラーが発生します。
カスタム要素では、指定したオブジェクトで x:Name にマップされるプロパティ (CLR プロパティまたは依存関係プロパティ) は、プロパティを宣言するコードの RuntimeNamePropertyAttribute でこのプロパティを指定することによって、確立または変更できます。
Name は、XAML 属性構文や SetValue を使用するコードで設定できます。ただし、コードから Name プロパティを設定した場合、状況によっては、これを表すフィールド参照が名前スコープ内に作成されない場合があるので注意してください。コードに Name を設定する代わりに、コードから適切な名前スコープに対して NameScope メソッドを使用します。
また、Name は、内部テキストと XAML プロパティ要素構文を使用して設定できますが、一般的ではありません。x:Name は、XAML プロパティ要素構文で設定したり、SetValue を使用するコードで設定したりはできません。要素の属性構文を使用する場合にのみ設定できます。