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 を指定できます。

注釈

Important

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

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

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

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

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

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

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

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

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

適用対象

こちらもご覧ください