WPF 获取控件模板的控件和值
假设我们在WPF定义控件模板时,Button在模板内部有个由Template生成的控件Textbox,它的x:name=”TextVBox1” ,它们并不冲突,但Button内部不会看到控件的细节,控件内部元素也不会去理会控件外部有什么,如果我们要从外界访问Button内部的控件,获取它的属性值应该怎么做呢?其实WPF为我们准备了访问控件内部的代码的入口。
ControlTemplate和DataTemplate生成的控件都是由Template生成的控件,ControalTemplate和DataTemplate两个类均派生自FrameworkTemplate类,这个类有个名为FindNamede 的方法供我们检索内部控件,也就是说我们能得到Template找到其内部控件就不成问题,对于ControlTemplate对象,访问其目标控件Template属性就能拿到。
我们先寻找由ControlTemplate生成的控件,首先设计一个ControlTemplate并把它应用到UserControl上,界面上还有一个Button,在它点击事件处理中我们检索由ControlTempplate生成的代码;
1、界面XAML代码如下:
<Window x:Class="Wpf.FindName"
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:Wpf"
mc:Ignorable="d"
Title="FindName" Height="450" Width="800">
----------资源--------->
<Window.Resources>
------控件模板------->
<ControlTemplate x:Key="cTemp">
<StackPanel Background="Orange">
<TextBox Margin="6" x:Name="TextBox1"></TextBox>
<TextBox Margin="6" x:Name="TextBox2"></TextBox>
<TextBox Margin="6" x:Name="TextBox3"></TextBox>
</StackPanel>
</ControlTemplate>
</Window.Resources>
<StackPanel Background="Yellow">
<UserControl x:Name="uc" Template="{StaticResource cTemp}"></UserControl>
<Button Content="FindName" Height="30" Width="120" Click="Button_Click"></Button>
<Button Content="GetValues" Height="30" Width="120" Margin="10,10" Click="Button_Click1"></Button>
</StackPanel>
</Window>
2、按钮点击事件后台处理代码
//FileNmae 点击 给模板控件赋值值
private void Button_Click(object sender, RoutedEventArgs e)
{
//“uc”是xaml窗体中添加的UserControl控件的Name值
//找到Name为“uc”的控件的模板下的Name为“TextBox1”的控件
TextBox tb = this.uc.Template.FindName("TextBox1", this.uc) as TextBox;
tb.Text = "I can find my name!";//给该控件赋值
StackPanel sp = tb.Parent as StackPanel;//找到tb控件的父节点(上级)为StackPanel的控件
//分别给sq的两个子项赋值
(sp.Children[1] as TextBox).Text = "I can find my name too!";
(sp.Children[2] as TextBox).Text = "So easy!";
}
//GetValues 获取模板控件值
private void Button_Click1(object sender, RoutedEventArgs e)
{
//“uc”是xaml窗体中添加的UserControl控件的Name值
//获取Name为uc的控件下的指定TextBox对象
TextBox tb1 = this.uc.Template.FindName("TextBox1", this.uc) as TextBox;
TextBox tb2 = this.uc.Template.FindName("TextBox2", this.uc) as TextBox;
TextBox tb3 = this.uc.Template.FindName("TextBox3", this.uc) as TextBox;
//弹出提示框,获取值
MessageBox.Show("TextBox1的值为:" + tb1.Text.ToString() + ",TextBox2的值为:" + tb2.Text.ToString() + ",TextBox3的值为:" + tb3.Text.ToString());
}
页面结果:
点击按钮给对象赋值
点击按钮获取对象值