情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。
このトピックはまだ評価されていません - このトピックを評価する

FrameworkElement.FindName メソッド

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

名前空間:  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 名前スコープの概念の詳細については、「XAML 名前スコープ」を参照してください。

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

  • FindName などの実行時 API は、オブジェクト ツリーに対して動作しています。 これらのオブジェクトは、コンテンツ領域と、Silverlight プラグイン全体の 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 に基づいていない Silverlight テキスト オブジェクト モデルでの FindName 動作が有効になります。 いずれかの実装による FindName の呼び出しから、混合 FrameworkElement またはテキスト要素オブジェクト ツリーを検索したり、FrameworkElement.FindName および指定テキスト要素が相互に見つけることができるように共通の XAML 名前スコープを使用することができます。

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

メモメモ :

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

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


private System.Windows.Controls.Grid LayoutRoot;

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


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

Silverlight

サポート対象 : 5、4、3

Silverlight for Windows Phone

サポート対象 : Windows Phone OS 7.1、Windows Phone OS 7.0

Silverlight でサポートされるオペレーティング システムの詳細については、「サポートされているオペレーティング システムとブラウザー」を参照してください。

この情報は役に立ちましたか。
(残り 1500 文字)
フィードバックをいただき、ありがとうございました

コミュニティの追加

表示:
© 2014 Microsoft. All rights reserved.