2009-05-04 58 views
22

通常、WPFコントロールは.xamlファイルで宣言され、コードビハインド(.xaml.csファイル)では宣言されません。しかし、時にはそれらを操作するために、後ろのコードでこれらのコントロールのいくつかを使用する必要があります。 xamlファイルに「存在する」場合、そのようなコントロールのハンドルを取得するにはどうすればよいですか?ControlTemplateにあるWPFコントロールにアクセスする方法は?

答えて

31

ControlTemplateクラスのFindName()メソッドを使用できます。

// Finding the grid that is generated by the ControlTemplate of the Button 
Grid gridInTemplate = (Grid)myButton1.Template.FindName("grid", myButton1); 
+0

これは私のためにヌル例外を返していましたが、ここでいくつかの異なる答えを試しながら何かを実現しました:あなたが探しているテンプレートがmyButton1_に適用されている場合、CSharperの答えを使用してください。しかし、myButton1が単にテンプレートのメンバである場合、代わりに '(Grid)myButton1.FindName(" grid ");'を使用します(ボタンハンドラで便利です)。 – Naucle

4

私はあなたが求めているのかが不明ですので、私は、私はあなたの質問のように解釈しています両方のインスタンスをしようとしてお答えします。

1) あなたが明示的に制御を宣言して、それを直接編集したい場合は、あなたがしなければならないのは、このようなような名前のプロパティが設定されている:

<Canvas x:Name="myCanvas"/> 

をそれからを通じてキャンバスにアクセスすることができます以下のような名前:

​​

2) あなたが複数回、一般的なコントロールを宣言し、それを使用することを探しているなら、あなたはこのようにそれを行うことができます。

あなたは、複数のコントロールのためのテンプレートとしてリソース教材を使用し、Xを追加したい場合は

Ellipse tempEllipse = (Ellipse)FindResource("MyEllipse"); 

::共有=「false」の場合210

<Window> 
    <Window.Resources> 
     <Ellipse x:Key="myEllipse" Height="10" Width="10"> 
    </Window.Resources> 
</Window> 

あなたは、コードでこの構文を使用して、その定義済みのコントロールにアクセスすることができます。

+0

FindName()はnullを返し続けました。私のアプリケーションのために働いたFindResource()。ありがとう。 – JohnForDummies

関連する問題