次の方法で共有


FrameworkElement.FindName(String) メソッド

定義

指定した識別子名を持つオブジェクトを取得します。

public:
 virtual Platform::Object ^ FindName(Platform::String ^ name) = FindName;
IInspectable FindName(winrt::hstring const& name);
public object FindName(string name);
function findName(name)
Public Function FindName (name As String) As Object

パラメーター

name
String

Platform::String

winrt::hstring

要求されたオブジェクトの名前。

戻り値

Object

Platform::Object

IInspectable

要求されたオブジェクト。 現在の XAML 名前スコープで一致するオブジェクトが見つからなかった場合は、null にすることができます。

注釈

重要

メソッドを FindName 効果的に使用するには、XAML 名前スコープの概念と、XAML の読み込み時に XAML 名前スコープがどのように作成され、実行時に参照され、変更されるかを理解する必要があります。 詳細については、「 XAML 名前スコープ」を参照してください。

Windows ランタイム コードでの のFindName最も一般的な使用法は、XAML ページの生成されたInitializeComponent呼び出し内から行われます。 この状況では、 は XAML FindName ページが読み込まれた後にのみ呼び出されます。 InitializeComponent は、XAML 読み込みによってインスタンス化されたオブジェクトが分離コードによって簡単にアクセスできるようにインフラストラクチャを提供します。 その後、マークアップ宣言 された x:Name 属性と同じ名前を共有する変数としてオブジェクトを参照できます。

などの FindName ランタイム API は、メモリ内に存在するアプリの実行時オブジェクト ツリーに対して動作しています。 このオブジェクト ツリーの一部がテンプレートまたは実行時に読み込まれた XAML から作成された場合、XAML 名前スコープは通常、そのオブジェクト ツリー内で連続していません。 その結果、オブジェクト ツリーに、特定 FindName のスコープで見つからない名前付きオブジェクトが存在する可能性があります。 一般的なアプリケーション シナリオで発生する可能性がある XAML 名前スコープ間の不連続性は、テンプレートを適用してオブジェクトを作成するとき、または XamlReader.Load の呼び出しによってオブジェクトが作成され、その後オブジェクト ツリーに追加される場合です。

の予期しない null 結果 FindNameを返す場合は、次の手法を試してください。

  • テンプレートから取得される名前付きオブジェクトの場合、コントロールを定義または派生する場合は、テンプレートが適用されているオブジェクトのスコープから GetTemplateChild を呼び出すことができます。 GetTemplateChild を使用するには、派生クラス定義スコープに含める必要があります。これは、Control の保護されたメソッドであるためです。
  • 派生クラス定義スコープに含まれていない場合は、テンプレートの適用後にオブジェクトの有効期間内の特定の時点で VisualTreeHelper を使用して、テンプレートのビジュアル ツリーを入力できる場合があります ( Loaded イベントを処理します)。 VisualTreeHelper では、XAML 名前スコープの概念を使用するのではなく、ツリーを歩く際に親子メタファーを使用します。 ツリーを歩く場合、一般に、特定のテンプレートに由来するコントロールの構成に関する特定の知識が必要です。 コントロールで VisualTreeHelper.GetChild を使用して、コントロールの適用されたテンプレート ルートを取得し、テンプレート ルートで 特に を呼び出 FindName して、テンプレート XAML 内で名前が付けられた要素にアクセスできます。
  • XamlReader.Load の場合は、XamlReader.Load 呼び出しの戻り値への参照を保持する必要があります。これは、関連する作成された XAML 名前スコープの所有者または基礎となるオブジェクトです。 その後、代わりにそのスコープから を呼び出 FindName します。

によって FindName 返されるオブジェクトは、必ずしも FrameworkElement であるとは限りません。 たとえば、アニメーションストーリーボードに名前を適用すると、さまざまなアニメーションストーリーボードの種類が FrameworkElement から派生しません。

オブジェクト (または同様の x:Name 属性) の Name プロパティは、XAML マークアップのオブジェクト要素に属性を指定することによって割り当てられます。 最初のソース XAML が読み込まれた後に Name 値を設定できますが、この手法にはいくつかの制限があります ( 「名前の解説」を参照)。

TextElement は、同様の FindName を定義します。 これにより、FindNameFrameworkElement に限定されないオブジェクト モデルでの動作が可能になります。 のいずれかの実装 FindName による呼び出しは、混合 FrameworkElement /text 要素オブジェクト ツリーに走査でき、呼び出しで名前付きテキスト要素を検索できるように FrameworkElement.FindName 共通の XAML 名前スコープを使用できます。その逆も同様です。

オブジェクト ツリーで実行時に追加または変更された名前の値は、オブジェクト ツリー内のそのレベルで動作する XAML 名前スコープに更新されます。 つまり、新しい FrameworkElement を作成する場合は、 名前を付けてからオブジェクト ツリーに追加し、その XAML namescope 内から を呼び出すと FindName 、コードで作成されたオブジェクトを検索して返すことができます。

適用対象

こちらもご覧ください