WPF 获取控件模板的控件和值

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());
        }

页面结果:

点击按钮给对象赋值
在这里插入图片描述
点击按钮获取对象值
在这里插入图片描述

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值