查找父/子控件(元素、节点)

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

原文地址:https://www.cnblogs.com/dotnetHui/p/8395124.html

时间: 2024-08-04 22:06:35

查找父/子控件(元素、节点)的相关文章

查找子控件和父控件方法

一.查找某种类型的子控件,并返回一个List集合 public List<T> GetChildObjects<T>(DependencyObject obj, Type typename) where T : FrameworkElement        {            DependencyObject child = null;            List<T> childList = new List<T>(); for (int i

WPF查找子控件和父控件方法[转帖]

WPF查找子控件和父控件方法 一.查找某种类型的子控件,并返回一个List集合 public List<T> GetChildObjects<T>(DependencyObject obj, Type typename) where T : FrameworkElement { DependencyObject child = null; List<T> childList = new List<T>(); for (int i = 0; i <= V

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

public static class VisualTreeExtensions { /// <summary> /// 获取父节点控件 /// </summary> /// <typeparam name="T">子控件UI</typeparam> /// <param name="obj">子控件</param> /// <param name="name">

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

本文结合模板的应用初步介绍ListView的应用 一.Xaml中如何建立数据资源 大部分数据都会来自于后台代码,如何Xaml同样的建立数据源呢?比如建立一个学生List: 首先引入命名空间: xmlns:c="clr-namespace:System.Collections;assembly=mscorlib" 然后代码如下:   <c:ArrayList x:Key="stuList">            <local:Student Id=

总结来说 mode 取值 受父容器与子控件共同决定

在自定义控件时为了满足特定需求,widget大都是我们自己测量的.大家都知道测量时最重要的步骤就是重写onMeasure方法,来计算出宽高. 这里面的MeasureSpec 很重要,大家也都知道,它是一个java中的静态类,它有重要的三个静态常量和三个最重要的静态方法. 我这里说下MeasureSpec 的3中模式 UNSPECIFIED(未指定),父元素部队自元素施加任何束缚,子元素可以得到任意想要的大小: EXACTLY(完全),父元素决定自元素的确切大小,子元素将被限定在给定的边界里而忽略

父控件、子控件

1 每一个控件其实都是一个容器可以将其他控件放到该控件的内部比较常见的还是将UIView作为容器 2 可以将A控件放入B控件A控件是B控件的子控件B控件是A控件的父控件 3 每一个控制器都有一个UIView控制器本身是不可见能够看到的是控制器的View每一个控制器中都一个UIVIew的属性控制器中管理的所有子控件都是该控件的子控件

如果希望点击父控件子控件也响应的话, 可以给子控件加如下属性: ?android:duplicateParentState="true"

如果希望点击父控件子控件也响应的话, 可以给子控件加如下属性: android:duplicateParentState="true" 来自为知笔记(Wiz)

五种情况下会刷新控件状态(刷新所有子FWinControls的显示)——从DFM读取数据时、新增加子控件时、重新创建当前控件的句柄时、设置父控件时、显示状态被改变时

五种情况下会刷新控件状态(刷新控件状态才能刷新所有子FWinControls的显示): 在TWinControls.PaintControls中,对所有FWinControls只是重绘了边框,而没有整个重绘这些FWinControl子控件.那么什么时候才整个重绘全部FWinControls呢?这时候,就不是一个单纯的WM_PAINT来解决控件重绘的问题了,而是这个TWinControl.UpdateShowing函数: procedure TWinControl.UpdateShowing; v

记录下帮助一位网友解决的关于android子控件的onTouch或onClick和父OnTouch 冲突的问题。

前三天收到位网友的私信求助,问题大概如标题所示.具体是下面的情况,个人感觉,这个问题挺有趣,也会在实际项目开发中很常见.不想看前奏的请直接跳至解决方法. 问题原型: 父控件是自定义的 LinearLayout,目的是实现下拉刷新,这个自定义View的实现下拉操作思想是通过检测 onTouch 事件,然后,子控件有一个 scrollView,它是完全为了实现下滚和滚到底部实现加载更多的监听.看到这,我相信任何一个有类似项目开发经验的人,都会感到很熟悉的.下拉刷新+下滑加载更多. 在 scrollV