x:Name ディレクティブ
XAML 名前スコープ内の XAML 定義要素を一意に識別します。 フレームワークが API を提供したり、実行時に XAML で作成されたオブジェクト グラフにアクセスする動作を実装したりする場合は、XAML 名前スコープとその一意性モデルをインスタンス化されたオブジェクトに適用できます。
XAML 属性の使用法
<object x:Name="XAMLNameValue".../>
XAML 値
価値 | 形容 |
---|---|
XAMLNameValue |
XamlName 文法の制限に準拠する文字列。 |
備考
フレームワークのバッキング プログラミング モデルに x:Name
が適用された後、名前は、コンストラクターによって返されるオブジェクト参照またはインスタンスを保持する変数と同じです。
x:Name
ディレクティブの使用の値は、XAML 名前スコープ内で一意である必要があります。 既定では、.NET XAML サービス API で使用される場合、プライマリ XAML 名前スコープは 1 つの XAML 運用の XAML ルート要素で定義され、その XAML 運用環境に含まれる要素が含まれます。 1 つの XAML 運用環境内で発生する可能性がある追加の個別の XAML 名前スコープは、特定のシナリオに対処するためにフレームワークによって定義できます。 たとえば、WPF では、新しい XAML 名前スコープが定義され、その XAML 運用環境でも定義されている任意のテンプレートによって作成されます。 XAML 名前スコープ (WPF 用に記述されていますが、多くの XAML 名前スコープの概念に関連) の詳細については、「WPF XAML 名前スコープ
一般に、x:Key
も使用する状況では、x:Name
を適用しないでください。 特定の既存のフレームワークによる XAML 実装では、x:Key
と x:Name
の間に置換の概念が導入されていますが、これは推奨される方法ではありません。 .NET XAML Services では、INameScope や DictionaryKeyPropertyAttributeなどの名前/キー情報を処理する場合、このような置換の概念はサポートされていません。
x:Name
の許可と名前の一意性の適用に関する規則は、特定の実装フレームワークによって定義される可能性があります。 ただし、.NET XAML サービスで使用できるようにするには、XAML 名前スコープの一意性のフレームワーク定義は、このドキュメントの INameScope 情報の定義と一致している必要があり、情報が適用される場所に関する同じ規則を使用する必要があります。 たとえば、Windows Presentation Foundation (WPF) の実装では、リソース ディクショナリ、ページ レベルの XAML、テンプレート、その他の遅延コンテンツによって作成された論理ツリーなど、さまざまなマークアップ要素を個別の NameScope 範囲に分割し、それらの XAML 名前スコープ内で XAML 名の一意性を適用します。
.NET XAML Services XAML オブジェクト ライターを使用するカスタム型の場合、型の x:Name
にマップされるプロパティを確立または変更できます。 この動作を定義するには、型定義コードの RuntimeNamePropertyAttribute にマップするプロパティの名前を参照します。
RuntimeNamePropertyAttribute は型レベルの属性です。
XAML サービス Using.NET、INameScope インターフェイスを実装することで、XAML 名前スコープのサポートのバッキング ロジックをフレームワークに依存しない方法で定義できます。
WPF の使用に関する注意事項
XAML、部分クラス、および分離コードを使用する WPF アプリケーションの標準ビルド構成では、指定した x:Name
は、XAML がマークアップ コンパイル ビルド タスクによって処理され、そのフィールドがオブジェクトへの参照を保持するときに、基になるコードで作成されるフィールドの名前になります。 既定では、作成されたフィールドは内部です。 フィールド アクセスを変更するには、x:FieldModifier 属性を指定します。 WPF と Silverlight では、マークアップ コンパイルによって部分クラスのフィールドが定義され、名前が付けられますが、値は最初は空です。 次に、InitializeComponent
という名前の生成されたメソッドがクラス コンストラクター内から呼び出されます。
InitializeComponent
は、部分クラスの XAML 定義部分に存在する各 x:Name
値を入力文字列として使用する FindName
呼び出しで構成されます。 その後、戻り値が同じ名前のフィールド参照に割り当てられ、XAML 解析から作成されたオブジェクトがフィールド値に入力されます。
InitializeComponent
を実行すると、XAML 定義オブジェクトへの参照が必要な場合にいつでも明示的に FindName
を呼び出す必要はなく、x:Name
/フィールド名を使用して実行時オブジェクト グラフを直接参照できます。
Microsoft Visual Basic ターゲットを使用し、Page
ビルド アクションを含む XAML ファイルを含む WPF アプリケーションの場合、コンパイル時に別の参照プロパティが作成され、イベント ハンドラー デリゲートの Handles
構文をサポートするために、x:Name
を持つすべての要素に WithEvents
キーワードが追加されます。 このプロパティは常にパブリックです。 詳細については、「Visual Basic および WPF イベント処理」を参照してください。
x:Name
は、ページがビルド アクション (リソース ディクショナリの緩い XAML など) によってマークアップ コンパイルされない場合でも、読み込み時に名前を XAML 名前スコープに登録するために WPF XAML プロセッサによって使用されます。 この動作の 1 つの理由は、ElementName バインディングに x:Name
が必要な可能性があるためです。 詳細については、「データ バインディングの概要」を参照してください。
前述のように、x:Name
(または Name
) は、x:Key
も使用する状況では適用しないでください。 WPF ResourceDictionary には、自身を XAML 名前スコープとして定義する特別な動作がありますが、この動作を強制する方法として、INameScope API に対して Not Implemented または null 値が返されます。 WPF XAML パーサーが XAML 定義の ResourceDictionaryで Name
または x:Name
を検出した場合、名前はどの XAML 名前スコープにも追加されません。 XAML 名前スコープと FindName
メソッドからその名前を検索しようとすると、有効な結果が返されません。
x:Name と Name
多くの WPF アプリケーション シナリオでは、FrameworkElement や FrameworkContentElement など、いくつかの重要な基底クラスの既定の XAML 名前空間で指定されている Name
依存関係プロパティがこの同じ目的を満たしているため、x:Name
属性の使用を回避できます。 フレームワーク レベルで Name
プロパティを持たない要素へのコード アクセスが重要な一般的な XAML および WPF シナリオがまだあります。 たとえば、特定のアニメーションおよびストーリーボード サポート クラスは、Name
プロパティをサポートしていませんが、多くの場合、アニメーションを制御するためにコードで参照する必要があります。 後でコードから参照する場合は、XAML で作成されるタイムラインと変換の属性として x:Name
を指定する必要があります。
Name がクラスのプロパティとして使用できる場合、Name と x:Name
は属性として同じ意味で使用できますが、両方が同じ要素で指定されている場合、解析例外が発生します。 XAML がマークアップ コンパイルの場合、マークアップ コンパイル時に例外が発生し、それ以外の場合は読み込み時に発生します。
Name は XAML 属性構文を使用して設定でき、コードでは SetValueを使用して設定できます。ただし、コードで Name プロパティを設定しても、XAML が既に読み込まれているほとんどの状況では、XAML 名前スコープ内に代表的なフィールド参照が作成されないことに注意してください。 コードで Name を設定する代わりに、適切な名前スコープに対してコードから NameScope メソッドを使用します。
Name は、プロパティ要素の構文と内部テキストを使用して設定することもできますが、これは一般的ではありません。 これに対し、x:Name
は XAML プロパティ要素の構文や、SetValueを使用したコードでは設定できません。ディレクティブであるため、オブジェクトの属性構文を使用してのみ設定できます。
Silverlight の使用に関する注意事項
Silverlight の x:Name
については、別途記載されています。 詳細については、「XAML 名前空間 (x:) 言語機能 (Silverlight)を参照してください。
関連項目
.NET Desktop feedback