整理一下项目中常用的找控件功能,包括找父/子控件、找到所有同类型子控件(比如ListBox找到所有Item)。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7. using System.Windows.Media;
  8. namespace MyDemo.Utils
  9. {
  10. /// <summary>
  11. /// 用于查找控件的工具类:找到父控件、子控件
  12. /// </summary>
  13. class ControlsSearchHelper
  14. {
  15. /// <summary>
  16. /// 查找父控件
  17. /// </summary>
  18. /// <typeparam name="T">父控件的类型</typeparam>
  19. /// <param name="obj">要找的是obj的父控件</param>
  20. /// <param name="name">想找的父控件的Name属性</param>
  21. /// <returns>目标父控件</returns>
  22. public static T GetParentObject<T>(DependencyObject obj, string name) where T : FrameworkElement
  23. {
  24. DependencyObject parent = VisualTreeHelper.GetParent(obj);
  25. while (parent != null)
  26. {
  27. if (parent is T && (((T)parent).Name == name | string.IsNullOrEmpty(name)))
  28. {
  29. return (T)parent;
  30. }
  31. // 在上一级父控件中没有找到指定名字的控件,就再往上一级找
  32. parent = VisualTreeHelper.GetParent(parent);
  33. }
  34. return null;
  35. }
  36. /// <summary>
  37. /// 查找子控件
  38. /// </summary>
  39. /// <typeparam name="T">子控件的类型</typeparam>
  40. /// <param name="obj">要找的是obj的子控件</param>
  41. /// <param name="name">想找的子控件的Name属性</param>
  42. /// <returns>目标子控件</returns>
  43. public static T GetChildObject<T>(DependencyObject obj, string name) where T : FrameworkElement
  44. {
  45. DependencyObject child = null;
  46. T grandChild = null;
  47. for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
  48. {
  49. child = VisualTreeHelper.GetChild(obj, i);
  50. if (child is T && (((T)child).Name == name | string.IsNullOrEmpty(name)))
  51. {
  52. return (T)child;
  53. }
  54. else
  55. {
  56. // 在下一级中没有找到指定名字的子控件,就再往下一级找
  57. grandChild = GetChildObject<T>(child, name);
  58. if (grandChild != null)
  59. return grandChild;
  60. }
  61. }
  62. return null;
  63. }
  64. /// <summary>
  65. /// 获取所有同一类型的子控件
  66. /// </summary>
  67. /// <typeparam name="T">子控件的类型</typeparam>
  68. /// <param name="obj">要找的是obj的子控件集合</param>
  69. /// <param name="name">想找的子控件的Name属性</param>
  70. /// <returns>子控件集合</returns>
  71. public static List<T> GetChildObjects<T>(DependencyObject obj, string name) where T : FrameworkElement
  72. {
  73. DependencyObject child = null;
  74. List<T> childList = new List<T>();
  75. for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
  76. {
  77. child = VisualTreeHelper.GetChild(obj, i);
  78. if (child is T && (((T)child).Name == name || string.IsNullOrEmpty(name)))
  79. {
  80. childList.Add((T)child);
  81. }
  82. childList.AddRange(GetChildObjects<T>(child, ""));
  83. }
  84. return childList;
  85. }
  86. }
  87. }
  88. public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
  89. {
  90. if (depObj != null)
  91. {
  92. for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
  93. {
  94. DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
  95. if (child != null && child is T)
  96. yield return (T)child;
  97. foreach (T childOfChild in FindVisualChildren<T>(child))
  98. yield return childOfChild;
  99. }
  100. }
  101. }

小结:

  • 采用了递归的方式,在多级中去查找指定Name属性的父控件/子控件。如果不想指定名字,或者只想在上/下一级中查找(不递归),根据需求再稍作修改。
  • 虽说这是用的WPF的查找方式,依赖的库很多无法跨平台,但是这种递归查找的方式值得学习和借鉴。(例如以后做Unity项目时可以拿来参考)

重要的学习参考:

http://www.wxzzz.com/1408.html
http://www.cnblogs.com/_ymw/archive/2013/02/18/2915870.html

【WPF】查找父/子控件(元素、节点)的更多相关文章

  1. WPF silverlight获取子控件(获取DataTemplate里的子控件)

    public static class VisualTreeExtensions { /// <summary> /// 获取父节点控件 /// </summary> /// ...

  2. C# WPF 之 遍历子控件

    /// <summary> /// 检查非空字段 /// </summary> /// <param name="IsOk"></para ...

  3. 【转】WPF查找子控件和父控件方法

    一.查找某种类型的子控件,并返回一个List集合 public List<T> GetChildObjects<T>(DependencyObject obj, Type ty ...

  4. WPF查找子控件和父控件方法

    一.查找某种类型的子控件,并返回一个List集合 public List<T> GetChildObjects<T>(DependencyObject obj, Type ty ...

  5. C# WPF 父控件通过使用可视化树找到子控件

    在我们使用WPF设计前台界面时,经常会重写数据模板,或者把控件放到数据模板里.但是一旦将控件放到数据模板中,在后台就没有办法通过控件的名字来获取它了,更没办法对它进行操作(例如,隐藏,改变控件的某个值 ...

  6. 初步探讨WPF的ListView控件(涉及模板、查找子控件) - GavinJun

    本文结合模板的应用初步介绍ListView的应用 一.Xaml中如何建立数据资源 大部分数据都会来自于后台代码,如何Xaml同样的建立数据源呢?比如建立一个学生List: 首先引入命名空间: xmln ...

  7. WPF查找父元素子元素

    原文:WPF查找父元素子元素 /// <summary>        /// WPF中查找元素的父元素        /// </summary>        /// &l ...

  8. wpf 父控件和子控件 各自触发鼠标按下事件

    父控件 PreviewMouseDown子控件 MouseDown

  9. Repeater 模板中查找子控件

    前言:对于Repeater控件,相信从事NETWeb开发的同仁们再熟悉不过了.因其呈现方式和Literal一样,并不在前端生成任何表单标签元素,所以属于比较轻量级的控件.不过青睐于Repeater的主 ...

随机推荐

  1. Vijos1935不可思议的清晨题解

    - 题目来源 https://vijos.org/p/1935 描写叙述 今天,是2015年2月14日,星期六,情人节. 这真是一个不可思议的日子.今天早上.我打开窗户,太阳居然从西側升了起来. 我与 ...

  2. 笔记本连接老式显示器(VGA线+HDMI接口)

    参考:http://www.cnblogs.com/me115/p/3970945.html

  3. iOS开发-Objective-C Block的实现方式

    前言:我们可以把Block当作一个闭包函数,它可以访问外部变量和局部变量,但默认是不可以修改外部变量.你可以使用它来做回调方法,比起使用代理(Delegate)会更加直观.顺带一提,苹果很多的接口(A ...

  4. 老毛桃pe装机工具备份系统

    电脑故障可以说是难以避免的,误操作或者修改了哪个设置系统就莫名其妙崩溃了.这在日常使用当中并不鲜见,许多用户就会寻求备份系统方法.有没有好的一键备份系统教程可以参考呢?在本篇教程中,就容我跟大家讲讲怎 ...

  5. C plus plus 控制格式

    使用这些格式需要声明包含<iomainip> long flags( ) const 返回当前的格式标志.long flays(long newflag) 设置格式标志为newflag,返 ...

  6. html导出图片

    有一个神奇的库:html2canvas. 这个库简洁优美,使用方便. 下面先看一个小demo,它需要用到一张图片:haha.jpg. <html> <head> <scr ...

  7. Oracle自定义函数和存储过程示例,自定义函数与存储过程区别

    参考资料:http://www.newbooks.com.cn/info/60861.html oracle自定义函数学习和连接运算符(||) 贴一段中文文档示例,应该就可以开始工作了: --过程(P ...

  8. Oracle游标解析

    本节对Oracle中的游标进行详细讲解. 本节所举实例来源Oracle中scott用户下的emp表dept表: 一.游标: 1.概念: 游标的本质是一个结果集resultset,主要用来临时存储从数据 ...

  9. python学习笔记011——闭包

    1 定义 定义:在计算机科学中,闭包是词法闭包的简称,是引用了自由变量的函数 简单地说:闭包就是能够读取其他函数内部变量的函数,闭包是将函数内部和函数外部连接起来的桥梁.——来源百度百科 2 描述 形 ...

  10. C#--类成员

    数据成员: 字段: 常量: 函数成员(执行代码): 方法: 属性 构造函数 析构函数 运算符 索引 事件 可以被声明为Static的类成员是: