整理一下项目中常用的找控件功能,包括找父/子控件、找到所有同类型子控件(比如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. MyEclipse上的第一个java web

    简单解说怎样MyEclipse上开发一个web project 以及怎样部署的问题. 第一步: 创建一个web project File -> New -> Web Project 将出现 ...

  2. linux 常用awk命令

    linux awk命令详解awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每 ...

  3. shell 编程之2>&1含义

    http://blog.csdn.net/gyanp/article/details/7258356 经常可以在一些脚本,尤其是在crontab调用时发现如下形式的命令调用 /tmp/test.sh ...

  4. Java Socket 编程之Socket与ServerSocket的区别

    http://www.cnblogs.com/hq-antoine/archive/2012/02/11/2346474.html 1.1 ServerSocket类    创建一个ServerSoc ...

  5. php 文件上传,下载

    文件下载: html: <html> <body> <a href="1.rar">下载1.rar</a> <br /> ...

  6. golang(5)使用beego 开发 api server 和前端同学拆分开发,使用swagger

    1,beego api Swagger 是一个规范和完整的框架,用于生成.描写叙述.调用和可视化 RESTful 风格的 Web 服务.整体目标是使client和文件系统作为服务器以相同的速度来更新. ...

  7. errno之我见

    Errno能帮我们找到系统函数的错误信息. 比方open函数,假设正常返回时,其返回值是一个非负的整数. 异常时会返回-1.同一时候该系统函数会设置errno的值.让我们能够了解错误的原因. Errn ...

  8. Android仿联系人列表分组悬浮列表实现,自己定义PinnedHeaderListView实现

    效果 (关于gif怎么生成的.我先录手机的屏幕得到mp4文件.然后用这个网址:https://cloudconvert.com/mp4-to-gif 进行的mp4转换gif,使用的时候须要又一次选择g ...

  9. cocos2dx 3.1从零学习(四)——内存管理(错误案例分析)

    本篇内容文字比較较多,可是这些都是建立在前面三章写代码特别是传值的时候崩溃的基础上的.可能表达的跟正确的机制有出入,还请指正. 假设有不理解的能够联系我.大家能够讨论一下,共同学习. 首先明白一个事实 ...

  10. python科学计算基础知识

    1.导入基本函数库 import numpy as np 2.获取矩阵元素字节数 a=np.array([1,2,3],dtype=np.float32) a.itemsizeoutput: 4 3. ...