这个方法在Window内使用是没有问题的。代码如下:
"WpfApp1.MainWindow" - xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:local="clr-namespace:WpfApp1"
- mc:Ignorable="d"
- Title="MainWindow" Height="450" Width="800" Background="Yellow">
-
-
-
-
"RecFill" Color="Red"> -
"RecStroke" Color="LightBlue"> -
-
-
-
-
-
-
-
后台代码:
- private void Button_Click(object sender, RoutedEventArgs e)
- {
- TextBlock text = this.btn.Template.FindName("text1", this.btn) as TextBlock;//查找与此模板中定义的指定名称关联的元素
-
- text.Text = "One";
-
- Grid grid = text.Parent as Grid;//获取模板内(text)控件的逻辑父元素
- (grid.Children[1] as TextBlock).Text = "Two";
- (grid.Children[2] as TextBlock).Text = "Three";
- (grid.Children[3] as TextBlock).Text = "Four";
- }
显示结果:
可是如果这个方法在UserControl中使用,是找不到模板中的控件的。
- //
- // 摘要:
- // 查找与此模板中定义的指定名称关联的元素。
- //
- // 参数:
- // name:
- // 字符串名称。
- //
- // templatedParent:
- // 应用此模板的 System.Windows.FrameworkElement 的上下文。
- //
- // 返回结果:
- // 与指定名称关联的元素。
- public object FindName(string name, FrameworkElement templatedParent);
原因是控件初始化时还未生成,如果想占用这种方法设置ControlTtemplate中的属性。要把它放到Load方法中。这么使用就可以了。
函数中已找到模板中的Button,这样就可以后台修改属性了。