FrameworkElement.FindName 根据名字查找控件
WPF FrameworkElement.FindName 根据名字查找控件
运行环境: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);
}
}
}
运行效果如下:

但是删除的时候,发现 FindName() 返回的值为 null,没有找到控件。找了半天资料,才发现不在前台 Xaml 里面定义的控件名字,要用 RegisterName() 方式来注册一下名字,后面的 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);
}
运行效果如下:

FrameworkElement.FindName 根据名字查找控件的更多相关文章
- WPF 中动态创建、删除控件,注册控件名字,根据名字查找控件
动态创建控件 1.容器控件.RegisterName("Name",要注册的控件) //注册控件 2.容器控件.FindName("Name") as 控 ...
- WPF中查找控件的扩展类
在wpf中查找控件要用到VisualTreeHelper类,但这个类并没有按照名字查找控件的方法,于是搜索网络,整理出下面这个类,感觉用起来很是方便. 贴出来,供大家参考. /// <summa ...
- 【完全开源】百度地图Web service API C#.NET版,带地图显示控件、导航控件、POI查找控件
目录 概述 功能 如何使用 参考帮助 概述 源代码主要包含三个项目,BMap.NET.BMap.NET.WindowsForm以及BMap.NET.WinformDemo. BMap.NET 对百度地 ...
- c#winform如何通过控件名查找控件
//根据控件名称查找控件 //作用根据控件的配置项目, Control[] myfindcs = this.Controls.Find("button4", true); if ( ...
- Dynamic CRM 2013学习笔记(八)过滤查找控件 (类似省市联动)
我们经常要实现类似省市联动一样的功能,常见的就是二个查找控件,一个选择了省后,另一个市的查找控件就自动过滤了,只显示当前省下的市,而不是所有的市.当然这是最简单的,实际工作中还有更复杂的功能要通过过滤 ...
- [转] WinForm自定义函数FindControl实现按名称查找控件
原文地址 WinForm自定义函数FindControl实现按名称查找控件 本文所述实例实现WinForm自定义函数FindControl实现按名称查找控件的功能,在C#程序开发中有一定的实用价值. ...
- 为网上流行论点“UIAutomator不能通过中文文本查找控件”正名
1. 问题描述和起因 相信大家学习UIAutomator一开始的时候必然会看过一下这篇文章. Android自动化测试(UiAutomator)简要介绍 因为你在百度输入UIAutomator搜索的时 ...
- 老李推荐:第14章9节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-遍历控件树查找控件
老李推荐:第14章9节<MonkeyRunner源码剖析> HierarchyViewer实现原理-遍历控件树查找控件 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员 ...
- 【转】【完全开源】百度地图Web service API C#.NET版,带地图显示控件、导航控件、POI查找控件
[转][完全开源]百度地图Web service API C#.NET版,带地图显示控件.导航控件.POI查找控件 目录 概述 功能 如何使用 参考帮助 概述 源代码主要包含三个项目,BMap.NET ...
随机推荐
- BZOJ4292 PA2015 Równanie 【暴力水题】
BZOJ4292 PA2015 Równanie Description 对于一个正整数n,定义f(n)为它十进制下每一位数字的平方的和.现在给定三个正整数k,a,b,请求出满足a<=n< ...
- Byte.parseByte(String s,int radix)的解释
1. 由 基本数据型态转换成 String String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 也就是 String.valueOf() 这个参数多载的方法 有下 ...
- python(十二):网络编程之ISO/OSI模型
互联网(Internet)是依据操作系统,在计算机硬件的基础上建立起的通讯机制.它依赖于TCP/IP协议栈. 一.ISO/OSI模型 1.ISO七层模型与OSI五层模型 它们将计算机抽象成了具有层级关 ...
- JavaWeb向浏览器返回一个音频流
浏览器直接播放音频文件,1是直接访问一个html的音频文件,,2 是返回一个Java音频流给浏览器解析. 下面实现一个java的wav文件音频流,可以直接播放音频文件 package org.lib. ...
- win32鼠标和键盘相关函数
键盘相关函数:http://msdn.microsoft.com/en-us/library/windows/desktop/ms645530%28v=vs.85%29.aspx 鼠标相关函数:htt ...
- 莫名其妙的js基础学习!
JavaScript基本组成部分: 1,ECMAScript:js的语法标准,基本的变量,运算符,函数,if语句,for语句等 2,DOM:操作网页上的元素API,比如盒子的移动,变色,轮播图等. 3 ...
- oracle之 v$sql_monitor 监视正在运行的SQL语句的统计信息
11g中引入了新的动态性能视图V$SQL_MONITOR,该视图用以显示Oracle监视的SQL语句信息.SQL监视会对那些并行执行或者消耗5秒以上cpu时间或I/O时间的SQL语句自动启动,同时在V ...
- [Oracle] CPU/PSU补丁安装详细教程
Oracle CPU的全称是Critical Patch Update, Oracle对于其产品每个季度发行一次安全补丁包,通常是为了修复产品中的安全隐患,以下是对CPU/PSU补丁安装的具体操作步骤 ...
- 使用Nancy搭建简单的Http服务的示例demo
刚刚接触Nancy没几天,暂时还不会使用Nancy来做web开发,只是使用Nancy实现了一个简单的Http服务的Demo程序,实现对Post和Get请求的处理. Demo的示例代码地址如下:http ...
- SPUtils
public class SPUtils { /** * 保存在手机里的SP文件名 */ public static final String FILE_NAME = "my_sp" ...