Framework​Element.​Find​Name 根据名字查找控件

时间:2022-09-04 23:49:17

WPF Framework​Element.​Find​Name 根据名字查找控件

运行环境:Window7 64bit,NetFramework4.7,C# 7.0, 编者:乌龙哈里 2017-10-04


参考:

章节:


正文:

最近写个小玩意,本来是想用 TabControl 标明标签,然后 TabItem 做容器里面放些控件,但是我 TabItem里面的控件完全一样,用 TabItem 来做容器似乎太笨重了,于是想用个 StackPanel 来放标签,其他控件用个 Grid 来包裹就成了。测试的时候发现 FindName() 找不到后台程序生成的 RadioButton。程序如下:

Xaml 界面程序

<Window x:Class="学习FindName.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"
        mc:Ignorable="d"
        Title="MainWindow" Height="300" Width="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="6*"/>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="32"/>
        </Grid.RowDefinitions>
        <ListBox Name="lstShow" Grid.Row="0"/>
        <StackPanel Name="stackpanel" Orientation="Horizontal" Grid.Row="1"/>
        <Grid Grid.Row="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*"/>
                <ColumnDefinition Width="1*"/>
            </Grid.ColumnDefinitions>
            <Button Name="btnAdd" Content="添加" Margin="3" Grid.Column="0" Click="btnAdd_Click" />
            <Button Name="btnDrop" Content="删除" Margin="3" Grid.Column="1" Click="btnDrop_Click" />
        </Grid>
    </Grid>
</Window>

C# 后台程序:

using System.Windows;
using System.Windows.Controls;

namespace 学习FindName
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        private int RadioButtonNum = 0;

public MainWindow()
        {
            InitializeComponent();
        }
        //---添加 radiobutton
        private void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            RadioButtonNum++;
            string s = "rbn" + RadioButtonNum.ToString();
            RadioButton rbn = new RadioButton{ Name = s, Content = s,Margin=new Thickness(3)};
            rbn.Click += RadioButton_Click;
            stackpanel.Children.Add(rbn);
        }
        //---删除 radiobutton
        private void btnDrop_Click(object sender, RoutedEventArgs e)
        {
            string s = "rbn" + RadioButtonNum.ToString();
            RadioButton rbn = stackpanel.FindName(s) as RadioButton;
            stackpanel.Children.Remove(rbn);
        }
        private void RadioButton_Click(object sender, RoutedEventArgs e)
        {
            //(sender as RadioButton).IsChecked = true;
            string s = (sender as RadioButton).Name;
            RadioButtonNum = int.Parse(s[s.Length - 1].ToString());
            lstShow.Items.Add(s);
        }
    }
}

运行效果如下:

Framework​Element.​Find​Name 根据名字查找控件

但是删除的时候,发现 FindName() 返回的值为 null,没有找到控件。找了半天资料,才发现不在前台 Xaml 里面定义的控件名字,要用 ​Register​Name() 方式来注册一下名字,后面的 FindName() 才能找到。
更改程序如下:

//---添加 radiobutton
private void btnAdd_Click(object sender, RoutedEventArgs e)
{
    RadioButtonNum++;
    string s = "rbn" + RadioButtonNum.ToString();
    RadioButton rbn = new RadioButton{ Name = s, Content = s,Margin=new Thickness(3)};
    rbn.Click += RadioButton_Click;
    stackpanel.Children.Add(rbn);
    //注册一下名字,没有这句后面的 FindName() 将找不到控件
    stackpanel.RegisterName(s, rbn);
}
//---删除 radiobutton
private void btnDrop_Click(object sender, RoutedEventArgs e)
{
    string s = "rbn" + RadioButtonNum.ToString();

RadioButton rbn = stackpanel.FindName(s) as RadioButton;
    rbn.Click -= RadioButton_Click;//事件如果不注销,容易引起内存泄漏
    stackpanel.Children.Remove(rbn);
}
private void RadioButton_Click(object sender, RoutedEventArgs e)
{
    //(sender as RadioButton).IsChecked = true;
    string s = (sender as RadioButton).Name;
    RadioButtonNum = int.Parse(s[s.Length - 1].ToString());
    lstShow.Items.Add(s);
}

运行效果如下:

Framework​Element.​Find​Name 根据名字查找控件

Framework​Element.​Find​Name 根据名字查找控件的更多相关文章

  1. WPF 中动态创建、删除控件,注册控件名字,根据名字查找控件

    动态创建控件 1.容器控件.RegisterName("Name",要注册的控件)   //注册控件 2.容器控件.FindName("Name") as  控 ...

  2. WPF中查找控件的扩展类

    在wpf中查找控件要用到VisualTreeHelper类,但这个类并没有按照名字查找控件的方法,于是搜索网络,整理出下面这个类,感觉用起来很是方便. 贴出来,供大家参考. /// <summa ...

  3. 【完全开源】百度地图Web service API C&num;&period;NET版,带地图显示控件、导航控件、POI查找控件

    目录 概述 功能 如何使用 参考帮助 概述 源代码主要包含三个项目,BMap.NET.BMap.NET.WindowsForm以及BMap.NET.WinformDemo. BMap.NET 对百度地 ...

  4. c&num;winform如何通过控件名查找控件

    //根据控件名称查找控件 //作用根据控件的配置项目, Control[] myfindcs = this.Controls.Find("button4", true); if ( ...

  5. Dynamic CRM 2013学习笔记(八)过滤查找控件 (类似省市联动)

    我们经常要实现类似省市联动一样的功能,常见的就是二个查找控件,一个选择了省后,另一个市的查找控件就自动过滤了,只显示当前省下的市,而不是所有的市.当然这是最简单的,实际工作中还有更复杂的功能要通过过滤 ...

  6. &lbrack;转&rsqb; WinForm自定义函数FindControl实现按名称查找控件

    原文地址 WinForm自定义函数FindControl实现按名称查找控件 本文所述实例实现WinForm自定义函数FindControl实现按名称查找控件的功能,在C#程序开发中有一定的实用价值. ...

  7. 为网上流行论点&OpenCurlyDoubleQuote;UIAutomator不能通过中文文本查找控件”正名

    1. 问题描述和起因 相信大家学习UIAutomator一开始的时候必然会看过一下这篇文章. Android自动化测试(UiAutomator)简要介绍 因为你在百度输入UIAutomator搜索的时 ...

  8. 老李推荐:第14章9节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-遍历控件树查找控件

    老李推荐:第14章9节<MonkeyRunner源码剖析> HierarchyViewer实现原理-遍历控件树查找控件   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员 ...

  9. 【转】【完全开源】百度地图Web service API C&num;&period;NET版,带地图显示控件、导航控件、POI查找控件

    [转][完全开源]百度地图Web service API C#.NET版,带地图显示控件.导航控件.POI查找控件 目录 概述 功能 如何使用 参考帮助 概述 源代码主要包含三个项目,BMap.NET ...

随机推荐

  1. 网站建设用的HTTP状态码

    在网站建设的实际应用中,容易出现很多小小的失误,就像mysql当初优化不到位,影响整体网站的浏览效果一样,其实,网站的常规http状态码的表现也是一样,Google无法验证网站几种解决办法,提及到由于 ...

  2. iOS多线程-02-GCD

    简介 GCD(Grand Center Dispatch)是Apple为多核的并行运算提出的解决方案,纯C语言 更加适配多核处理器,且自动管理线程的生命周期,使用起来较为方便 GCD通过任务和队列实现 ...

  3. 推荐一款开源的C&num;TCP通讯框架

    原来收费的TCP通讯框架开源了,这是一款国外的开源TCP通信框架,使用了一段时间,感觉不错,介绍给大家 框架名称是networkcomms 作者开发了5年多,目前已经停止开发,对于中小型的应用场景,够 ...

  4. 如何创建和使用XMLHttpRequest对象?

    创建XMLHttpRequest对象,我有以下几种方法,顺带给大家介绍下他们的使用,一起来看看那吧. 1. 第一种,我们可以使用构造函数的方式.直接new的方式,这样我们就构造了这个对象. reque ...

  5. Java从服务器上获取时间,动态在jsp页面显示

    Java获取服务器时间,动态显示到jsp页面,大家都是到Java只能获取一次,到页面的时间是静态的,不过通过js和Java的合作,巧妙地实现此功能 本人是给电视做系统,客户要求页面能显示时间,因为电视 ...

  6. SharePoint DataFormWebPart 通过Caml和xslt聚合内容

    以下是一个例子,SPDataSource用于查询内容,DatasourceMode属性指定查询范围(网站集,网站,列表),SelectCommand是Caml查询:Xsl展示内容,下面列子是用tabl ...

  7. &sol;&sol;string scriptstrs &equals; &quot&semi;&lt&semi;script&gt&semi;alert&lpar;&&num;39&semi;欢迎光临!&&num;39&semi;&rpar;&semi;&lt&semi;&sol;script&gt&semi;&quot&semi;&semi;

    //string scriptstrs = "<script>alert('欢迎光临!');</script>"; //if (!Page.ClientSc ...

  8. Geodatabase - 修改字段别名&lpar;Field Alias&rpar;

    以下代码演示的是通过个人数据库打开要素类,并对指定的字段别名进行修改,其中,需要注意的是,不能通过Engine中的AxMapControl直接获得,如 //直接获得IFeatureClass. //E ...

  9. 【python35&period;1--EasyGui界面】

    一.什么是EasyGUI EasyGUI是python中一个非常简单的GUI编程模块,不同于其他的GUI生成器,它不是事件驱动的,相反,所有的GUI交互都是通过简地函数调用就可以实现(意思是:函数调用 ...

  10. 94&period; Binary Tree Inorder Traversal&lpar;Tree&comma; stack&rpar;

    Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...