次の方法で共有


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 呼び出し内から行われます。 この状況では、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 から派生しません。

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

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

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

適用対象

こちらもご覧ください