エクスポート (0) 印刷
すべて展開
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

FrameworkElement.FindName メソッド

2013/12/12

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

Namespace:  System.Windows
アセンブリ:  System.Windows (System.Windows.dll 内)

public Object FindName(
	string name
)

パラメーター

name
型: System.String
要求されたオブジェクトの名前。

戻り値

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

重要: 重要:

FindName メソッドを効果的に使用するには、XAML 名前スコープの概念、XAML の読み取り時の XAML 名前スコープの作成方法、および実行時の XAML 名前スコープの参照方法や変更方法を理解する必要があります。

XAML 名前スコープのいくつかの重要な概念を次にまとめます。

  • FindName などの実行時 API は、オブジェクト ツリーに対して動作しています。これらのオブジェクトは、コンテンツ領域と、CLR ランタイム エンジンに読み込まれます。オブジェクト ツリーの一部がテンプレートまたは実行時に読み込まれた XAML から作成された場合、XAML 名前スコープは、通常、そのオブジェクト ツリー全体と隣接していません。その結果、オブジェクト ツリー内には、特定の FindName 呼び出しで見つからない名前付きオブジェクトが含まれる場合があります。

  • 一般的なアプリケーションのシナリオで見られる XAML 名前スコープ間の不連続性は、テンプレートの適用によってオブジェクトが作成されるとき、または XamlReader.Load の呼び出しによってオブジェクトが作成され、メイン オブジェクト ツリーに後で追加されるときに発生します。

  • FindName に対して予期しない null の結果を返した場合、必要な名前付きオブジェクトを見つけるには次のような手法があります。

    • テンプレートから得られる名前付きオブジェクトに対して、コントロールを作成している場合には、テンプレートが適用されるオブジェクトのスコープから GetTemplateChild を呼び出すことができます。GetTemplateChild を使用するには、派生クラスの定義のスコープで作業する必要があります。これが、Control の保護されたメソッドであるためです。

    • 派生クラスの定義の範囲内にいない場合は、テンプレートの適用後に、オブジェクトの有効期間内の任意の時点で、VisualTreeHelper を使用してテンプレートのビジュアル ツリーにアクセスできる可能性があります。ただし、VisualTreeHelper は、XAML 名前スコープの概念を使用する代わりに、親子のメタファに基づいてツリーをたどります。通常、ツリーを走査するには、コントロールのコンポジションの特定の知識が必要です。これは、指定したテンプレートから取得します。

    • XamlReader.Load の場合は、XamlReader.Load 呼び出しの戻り値への参照を保持します。これは、関係する作成された XAML 名前スコープの所有者または基礎となるオブジェクトです。次に、そのスコープから FindName を呼び出します。

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

オブジェクトの Name プロパティ (または同等の XAML ディレクティブ x:Name) は、XAML マークアップでオブジェクト要素の属性を指定することによって割り当てられます。最初のソース XAML が読み込まれた後で Name の値を設定することはできますが、この手法にはいくつかの制限事項があります (Name の「解説」を参照)。Load の呼び出しに対する XAML 入力の一部として Name を指定できますが、このようにして作成した名前は個別の XAML 名前スコープに適用され、その適用範囲は XAML 入力のルート相当までに限られます。Load を呼び出した後、作成されたオブジェクトをメイン オブジェクト ツリーに追加すると、FindName を呼び出す方法、および呼び出し元のプログラミング スコープに影響します。

TextElement は、類似の FindName を定義します。これにより、FrameworkElement に基づいていない Windows Phone テキスト オブジェクト モデルでの FindName 動作が有効になります。いずれかの実装による FindName の呼び出しから、混合 FrameworkElement またはテキスト要素オブジェクト ツリーを検索したり、FrameworkElement.FindName および指定テキスト要素が相互に見つけることができるように共通の XAML 名前スコープを使用することができます。

オブジェクト ツリーで実行時に追加または変更される Name 値は、オブジェクト ツリーのそのレベルで該当する XAML 名前空間に反映されます。つまり、新しい FrameworkElement を作成し、Name を設定して、これをオブジェクト ツリーに追加すると、その XAML 名前空間内からの FindName の呼び出しにより、コードで作成されたオブジェクトを見つけて返すことができます。

メモメモ:

一般に、template 宣言されたコントロールでは、FindName を使用するのではなく、OnApplyTemplate オーバーライドの一部として GetTemplateChild を使用して、テンプレートの名前付きパーツを見つけます。これは、XAML 定義テンプレートからクラス ロジックおよび要素の参照を結合するために必要です。

次の例では、FindName を使用して、コンポーネントとして読み込まれた XAML ページから名前付き要素を検索します。ここでは、名前付き要素を単にフィールド参照として参照することはできません。これは、通常生成される InitializeComponent の呼び出しがない場合は、そのフィールドが存在しないためです。


private System.Windows.Controls.Grid LayoutRoot;

public Page()
{
    System.Windows.Application.LoadComponent(this, new System.Uri(
        "/WindowsPhoneApp1;component/Page.xaml", 
        System.UriKind.Relative));
    this.LayoutRoot = ((System.Windows.Controls.Grid)
        (this.FindName("LayoutRoot")));
}


(Windows Phone ページに対する XAML コンパイル ビルド動作によって生成されたコードで InitializeComponent の実際の定義を調べると、同様なコードを見つけることができます。各名前付き要素に対してフィールド参照値を割り当てる一連の FindName 呼び出しに注意してください。これにより、分離コードからの任意の実行時呼び出しで、これらのフィールド参照を簡単に使用できます。)

Windows Phone OS

サポート: 8.0, 7.1, 7.0

表示:
© 2014 Microsoft