C#のWPFで名前からコントロールを取得する

WPFではコントロールに表示する文字列など基本的な動作は、バインディングという方法を使って制御するのが一般的です。

WPFのバインディング その1

WPFのバインディング その2

WPFのバインディング その3

 

ですが、時にはコントロールをコードから直接操作したい場合もあるでしょう。

そのような場合は、コントロールに名前を付けておくとコードからアクセスする事が出来ます。

コントロールを取得

XAMLで定義したコントロールは x:Name 属性を付けておくと、コード側からその値を使ってコントロールを検索する事が出来ます。

        <TextBox x:Name="TestTextBox"/>

XAMLで↑のように定義された場合、コードでは↓のようにしてTextBoxコントロールを取得できます。

   TextBox tb = this.FindName("TestTextBox") as TextBox;
   if (null != tb)
   {
      tb.Text = "TEST!";
   }

FindNameメソッドのパラメータにx:Name属性の値を渡すとコントロールが取得できます。

指定の名前で見つからない場合はnullが返されます。

名前をそのまま変数名として使えるのでわざわざFindNameを使う事は少ないかもしれないですが・・・

 

Templateの中のコントロールを取得

        <Button x:Name="TestButton">
            <Button.Template>
                <ControlTemplate>
                    <Border x:Name="TestBorder" BorderBrush="Red" BorderThickness="1">
                        <Label>TEST</Label>
                    </Border>
                </ControlTemplate>
            </Button.Template>
        </Button>

XAMLで↑のようにControlTemplateの中で定義された”TestBorder”のような場合、

コードでは↓のようにしてTemplateのFindNameを使ってコントロールを取得する事ができます。

                var border = TestButton.Template.FindName("TestBorder", TestButton) as Border;
                if (null != border)
                {
                    border.BorderThickness = new Thickness(1);
                }