11.4.3 寻找失落的控件
ControlTemplate和DataTemplate两个类均派生自FrameworkTemplate类,这个类有个名为FindName的方法供我们检索其内部控件。
ControlTemplate:
<Window x:Class="WpfApp2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="200" Width="200">
<Window.Resources>
<ControlTemplate x:Key="ct">
<StackPanel Background="Orange" Width="100" Height="100">
<TextBox x:Name="textBox1" Margin="5"/>
<TextBox x:Name="textBox2" Margin="5"/>
<TextBox x:Name="textBox3" Margin="5"/>
</StackPanel>
</ControlTemplate>
</Window.Resources>
<Grid>
<StackPanel>
<UserControl x:Name="uc" Template="{StaticResource ResourceKey=ct}"/>
<Button Content="OK" Click="Button_Click" Margin="5" Width="60"/>
</StackPanel>
</Grid>
</Window>
private void Button_Click(object sender, RoutedEventArgs e)
{
TextBox textBox1 = this.uc.Template.FindName("textBox1", this.uc) as TextBox;
textBox1.Text = "月光宝盒";
StackPanel stackPanel = textBox1.Parent as StackPanel;
(stackPanel.Children[1] as TextBox).Text = "大话西游";
(stackPanel.Children[2] as TextBox).Text = "菠萝菠萝蜜";
}
DataTemplate:
<Window x:Class="WpfApp2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:objs="clr-namespace:WpfApp2.Objects"
Title="MainWindow" Height="200" Width="200">
<Window.Resources>
<objs:Student x:Key="ds" Name="Timothy" Skill="WPF" HasJob="True" Id="1"/>
<DataTemplate DataType="{x:Type objs:Student}">
<Border BorderBrush="Orange" BorderThickness="2" CornerRadius="5">
<StackPanel>
<TextBlock Text="{Binding Id}" Margin="5"/>
<TextBlock x:Name="textBlockName" Text="{Binding Name}" Margin="5"/>
<TextBlock Text="{Binding Skill}" Margin="5"/>
<TextBlock Text="{Binding HasJob}" Margin="5"/>
</StackPanel>
</Border>
</DataTemplate>
</Window.Resources>
<StackPanel>
<ContentPresenter x:Name="cp" Content="{StaticResource ds}" Margin="5"/>
<Button Content="Find" Margin="5,5" Click="Button_Click" Width="80"/>
</StackPanel>
</Window>
private void Button_Click(object sender, RoutedEventArgs e)
{
var st = this.cp.Content as Student;
MessageBox.Show(string.Format("Name: {0}", st.Name));
}
本文详细介绍了如何使用FrameworkTemplate类中的FindName方法来检索内部控件,并通过实例展示了在不同模板中查找特定控件的过程。

被折叠的 条评论
为什么被折叠?



