FrameworkElement.Name プロパティ
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
オブジェクトの識別名を取得または設定します。 XAML プロセッサが XAML マークアップからオブジェクト ツリーを作成する場合、ランタイム コードはこの名前で XAML で宣言されたオブジェクトを参照できます。
public:
property Platform::String ^ Name { Platform::String ^ get(); void set(Platform::String ^ value); };
winrt::hstring Name();
void Name(winrt::hstring value);
public string Name { get; set; }
var string = frameworkElement.name;
frameworkElement.name = string;
Public Property Name As String
<frameworkElement Name="xamlNameString"/>
プロパティ値
オブジェクトの名前。XamlName 文法で有効な文字列である必要があります ( x:Name 属性 リファレンスの表を参照)。 既定値は空の文字列です。
例
この例では、既存のオブジェクトから Name の値を取得し、その名前を使用してアニメーションを再ターゲットします。 アニメーションをターゲットに設定するには、 Storyboard.TargetName 添付プロパティを設定します。
private void Start_Animation(object sender, PointerRoutedEventArgs e)
{
// If the Storyboard is running and you try to change
// properties of its animation objects programmatically,
// an error will occur.
myStoryboard.Stop();
// Get a reference to the rectangle that was clicked.
Rectangle myRect = (Rectangle)sender;
// Change the TargetName of the animation to the name of the
// rectangle that was clicked.
myDoubleAnimation.SetValue(Storyboard.TargetNameProperty, myRect.Name);
// Begin the animation.
myStoryboard.Begin();
}
注釈
このプロパティの最も一般的な使用方法は、XAML マークアップでオブジェクトの x:Name 属性 を指定するか、マークアップで設定された値を読み取ります。 ほとんどの場合、 x:Name 属性と Name プロパティは同等です。 任意の 1 つの要素で、 x:Name 属性と Name プロパティは XAML 属性として相互に排他的です。マークアップ内の同じオブジェクト要素に x:Name と Name の両方を設定しようとすると、パーサー エラーがスローされます。
XAML に既定の ページ ビルド アクションを使用すると、 x:Name 属性 または Name を持つ XAML 要素は、XAML の読み込み時に最終的に InitializeComponent によって設定されるフィールド参照を生成します。 フィールド参照を使用すると、XAML オブジェクト ツリーがページまたはアプリに読み込まれると、オブジェクトをページ固有の分離コード内の名前で直接参照できるプログラミング モデルが可能になります。
名前は XAML 名前スコープで一意である必要があります。 一般に、XAML 名前スコープは XAML ページによって定義されますが、テンプレートや XamlReader.Load などの API の呼び出しなどの特定の機能では、個別の XAML 名前スコープを定義できます。 詳細については、 XAML 名前スコープに関するページを参照してください。
Name はローカライズしないでください。
Name は、分離コードのフィールド名変数として使用されます。 このようなコードは通常、UI を定義する XAML ファイルにアクセスできる可能性があるローカライザーにはアクセスできませんが、これはデプロイ モデルとローカライズ手順によって異なります。 これは、アプリの UI で Name から取得した文字列を表示しない理由の 1 つです。
名前のシナリオ
UI 要素を定義する XAML で x:Name または Name を設定すると、いくつかの主要なシナリオがサポートされます。
-
アニメーションのターゲット設定 オブジェクト プロパティにアニメーションを適用するには、特定のインスタンスをターゲットにする必要があります。 これを行うには、タイムラインで Storyboard.TargetName 添付プロパティを設定 します。 ここで設定する値は、
x:NameまたはNameとして割り当てた文字列です。 詳細については、ストーリーボードアニメーションを参照してください。 -
コントロール テンプレートの一部 ビジュアル状態モデルとコントロールの初期化をサポートするには、コントロール作成者はテンプレート 化されたコントロールの主要部分に
Name値を指定する必要があります。 詳細については、 XAML コントロール テンプレートに関するページを参照してください。 -
一般的な実行時の対話 たとえば、イベント ハンドラー内のコードでは、変更 UI を提供するオブジェクトのイベントを処理できますが、プロパティの変更は、近くの別の UI 要素で発生します。 この状況のコードを記述する最も簡単な方法は、
Nameから生成されたフィールド参照を使用することです。
Findname
任意の FrameworkElement から使用できるユーティリティ メソッド FindName は、現在の XAML 名前スコープ内にある限り、オブジェクト ツリー内の名前でオブジェクトを検索できます。
FindName は、XAML で作成されたオブジェクト ツリー全体を検索します。 技術的には、実際に検索 FindName は XAML 名前スコープです。これはツリーのメタファーを保持せず、代わりに名前のハッシュ テーブルとして表されます。
FindName では、適用されたテンプレートで定義されている名前が見つかりません。 適用されたテンプレート内の項目を検索するには、 VisualTreeHelper.GetChild を使用して、適用されたテンプレート ルート オブジェクトを取得します。 その後、そのルート オブジェクトに対して FindName を呼び出すことができます。これにより、大きなページではなく、テンプレートの XAML 名前スコープを検索することになります。
名前とデータ バインディング
Nameの文字列値をデータ バインディング ソースの直接ソース値として使用することはできません。 バインドを使用して UI で Name と同じ文字列値を表示する必要がある場合は、同じ値を Tag プロパティにレプリケートする必要があります。これはプロパティ バインド ソースとして使用できます。 また、バインド ターゲットとして Name を使用しないでください。
x:NameまたはNameの値は、ElementName バインドのソース要素を識別するために使用する識別子です。 詳細については、「 データ バインディングの詳細」を参照してください。
コードでの名前の設定
実行時にオブジェクトの Name の値を設定できますが、注意する必要がある重要な考慮事項と制限事項がいくつかあります。
オブジェクトに XAML で以前のName値が設定されている場合、実行時にコード内のNameの値を変更することは一般に推奨されません。 これは、オブジェクト ツリーの読み込み後に名前を設定しても、同等のフィールド参照の識別名が作成または変更されないためです。 最初のマークアップで x:Name が指定されているためにフィールド参照が既に存在し、 Nameの値を変更すると、フィールドがマークアップ定義名のままであるため、 FindName を使用してオブジェクトを検索するために使用する必要があるフィールドと名前が異なります。
コードで作成され、XAML で定義された名前の値を持たなかったオブジェクトの Name 値を設定することは、特定のシナリオに適しています。 このようなシナリオの 1 つは、共通ユーティリティ関数として FindName を使用して、XAML で作成されたオブジェクトまたはコードで作成されたオブジェクトをツリー内で検索できるようにする場合です。 そのシナリオを機能させるために、Windows ランタイムは実行時に引き続き XAML 名前スコープハッシュテーブル表現を使用して追加します。 既存の大部分の XAML で作成されたオブジェクト ツリーに新しい名前付きオブジェクトを追加する場合は、名前が一意である必要があります。それ以外の場合は、重複する名前の例外が発生します。
Nameを設定しようとすると、重複する名前の例外が発生しない可能性があります。 重複する名前のオブジェクトをメイン オブジェクト ツリーに追加するまで、新しいオブジェクトには独自の自己完結型 XAML 名前スコープがあります。 重複する名前の条件を検出できるのは、オブジェクトを大きなオブジェクト ツリーに接続した時点だけです。 または、メイン オブジェクト ツリーに接続するコレクションの Add メソッドの呼び出しなど、ツリー内のオブジェクトを接続した操作で例外が発生する可能性があります。
後で新しいオブジェクトを追加する XAML 名前スコープに既に存在する名前の値を知るのは困難な場合があります。 XAML 名前スコープ内の既存の名前の完全なハッシュテーブルを報告する特定の API はありません。 コードで名前の値を広範囲に設定する場合は、実行時の使用に固有の名前文字列を生成する手法が必要になる場合や、try-catch ブロックに新しい名前付きオブジェクトを追加する呼び出しをラップして、重複する名前から発生する可能性のある例外をキャッチする必要がある場合があります。 または、XAML で生成された名前の値を読み取る InitializeComponent 実装に独自のコードを追加することもできます。
Nameは、実行時に FrameworkElement または Inline オブジェクトに対してのみ設定できることに注意してください。 オブジェクトにNameプロパティがなく、XAML で名前を設定する場合は、Nameではなく、x:Name属性を使用する必要があります。このようなオブジェクトのランタイム名を設定するために使用できるランタイム API はありません。