架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 18854|回复: 0

[WPF] WPF中查找控件的扩展类

[复制链接]
发表于 2016-5-30 18:04:34 | 显示全部楼层 |阅读模式
在wpf中查找控件要用到VisualTreeHelper类,但这个类并没有按照名字查找控件的方法,于是搜索网络,整理出下面这个类,感觉用起来很是方便。

贴出来,供大家参考。

  1. /// <summary>
  2. /// WPF/Silverlight 查找控件扩展方法
  3. /// </summary>
  4. public static class VisualHelperTreeExtension
  5. {
  6.     /// <summary>
  7.     /// 根据控件名称,查找父控件
  8.     /// elementName为空时,查找指定类型的父控件
  9.     /// </summary>
  10.     public static T GetParentByName<T>(this DependencyObject obj, string elementName)
  11.     where T : FrameworkElement
  12.     {
  13.         DependencyObject parent = VisualTreeHelper.GetParent(obj);
  14.         while (parent != null)
  15.         {
  16.             if ((parent is T) && (((T)parent).Name == elementName || string.IsNullOrEmpty(elementName)))
  17.             {
  18.                 return (T)parent;
  19.             }
  20.             parent = VisualTreeHelper.GetParent(parent);
  21.         }

  22.         return null;
  23.     }

  24.     /// <summary>
  25.     /// 根据控件名称,查找子控件
  26.     /// elementName为空时,查找指定类型的子控件
  27.     /// </summary>
  28.     public static T GetChildByName<T>(this DependencyObject obj, string elementName)
  29.     where T : FrameworkElement
  30.     {
  31.         DependencyObject child = null;
  32.         for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
  33.         {
  34.             child = VisualTreeHelper.GetChild(obj, i);
  35.             if (child is T && (((T)child).Name == elementName) || (string.IsNullOrEmpty(elementName)))
  36.             {
  37.                 return (T)child;
  38.             }
  39.             else
  40.             {
  41.                 T grandChild = GetChildByName<T>(child, elementName);
  42.                 if (grandChild != null)
  43.                 {
  44.                     return grandChild;
  45.                 }
  46.             }
  47.         }
  48.         return null;
  49.     }

  50.     /// <summary>
  51.     /// 根据控件名称,查找子控件集合
  52.     /// elementName为空时,查找指定类型的所有子控件
  53.     /// </summary>
  54.     public static List<T> GetChildsByName<T>(this DependencyObject obj, string elementName)
  55.     where T : FrameworkElement
  56.     {
  57.         DependencyObject child = null;
  58.         List<T> childList = new List<T>();
  59.         for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
  60.         {
  61.             child = VisualTreeHelper.GetChild(obj, i);
  62.             if (child is T && (((T)child).Name == elementName) || (string.IsNullOrEmpty(elementName)))
  63.             {
  64.                 childList.Add((T)child);
  65.             }
  66.             else
  67.             {
  68.                 List<T> grandChildList = GetChildsByName<T>(child, elementName);
  69.                 if (grandChildList != null)
  70.                 {
  71.                     childList.AddRange(grandChildList);
  72.                 }
  73.             }
  74.         }
  75.         return childList;
  76.     }
  77. }
复制代码


使用的时候非常简单,比如查找datagrid里模板列的一个叫“myTextBox”的文本框,可以这样写:

  1. var child = dataGrid.GetChildByName<TextBox>("myTextBox");
  2. if (child != null)
  3. {
  4.     child.Text = "abc";
  5. }
复制代码


注意:初期化页面的时候,如果查找控件的代码放在Loaded事件中,会找不到控件;应该放在LayoutUpdated事件中,这时候xaml已经加载完毕,所有的子控件才能取到。

但是LayoutUpdated事件只要页面有更新,它都会触发,如果要达到Loaded事件的效果,我们可以设置一个flag在控制代码只在初期化时执行一次,现在也没有想到更好的办法来实现,大概如下:

  1. bool firstLoad = true;
  2. private void UserControl_LayoutUpdated(object sender, EventArgs e)
  3. {
  4.     if (firstLoad)
  5.     {
  6.         //第一次加载要执行的代码
  7.         //...
  8.         firstLoad = false;
  9.     }
  10. }
复制代码





上一篇:WPF通过反射查找DataGrid里面的CheckBox控件
下一篇:推荐一款vs高亮插件
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2026-6-4 00:17

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表