如何访问位于 ControlTemplate 中的 WPF 控件?

26

通常,WPF控件是在.xaml文件中声明而不是在代码后面的.xaml.cs文件中声明的。但是,有时我需要在代码后面使用其中一些控件来操纵它们。如果这样的控件“驻留”在.xaml文件中,我该如何获取其句柄?

2个回答

34
您可以使用 ControlTemplate 类的 FindName() 方法。
// Finding the grid that is generated by the ControlTemplate of the Button
Grid gridInTemplate = (Grid)myButton1.Template.FindName("grid", myButton1);

这段代码在我的电脑上返回了一个空异常,后来我在 Stack Overflow 上尝试了一些不同的答案时意识到了一些问题:如果你正在查找的模板被应用于 myButton1,那么请使用 CSharper 的答案。但是,如果 myButton1 只是该模板的成员,请改用 (Grid)myButton1.FindName("grid");(在按钮处理程序中非常有用)。 - Naucle

4

我不确定你的问题是什么,所以我会尝试回答我理解为你的两种情况。

1)如果您想声明一个显式控件,然后直接编辑它,您只需要设置名称属性,如下所示:

<Canvas x:Name="myCanvas"/>

您可以通过名称访问画布,如下所示:
myCanvas.Background = Brushes.Blue;

2) 如果您想声明一个通用控件,并且多次使用它,可以按照以下方式进行:

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

您可以使用以下代码在代码中访问预定义的控件:
Ellipse tempEllipse = (Ellipse)FindResource("MyEllipse");

如果您希望将资源用作多个控件的模板,请添加x:Shared="false"。


FindName() 一直返回 null。FindResource() 对我的应用程序有效。谢谢。 - JohnForDummies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接