【转载】wpf 查找指定类型的子控件

本文介绍了使用C#语言通过Visual Tree Helper类来查找指定类型和名称的子控件,以及查找指定类型的父控件的方法。重点展示了递归遍历控件树的过程,实现高效子控件查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.youkuaiyun.com/fallincloud/article/details/6960255#

查找指定类型的子控件


[csharp] view plain copy print ?
  1. /// <summary> 
  2. /// Find Child with Visual Tree 
  3. /// </summary> 
  4. /// <typeparam name="T">specail type</typeparam> 
  5. /// <param name="root">the element starts</param> 
  6. /// <returns></returns> 
  7. public static T FindChild<T>(DependencyObject root) where T : DependencyObject 
  8.     if (root == null
  9.         return null
  10.  
  11.     T founded = null
  12.  
  13.     for (int j = 0; j < VisualTreeHelper.GetChildrenCount(root); j++) 
  14.     { 
  15.         DependencyObject d = VisualTreeHelper.GetChild(root, j); 
  16.         T childType = d as T; 
  17.         if (childType == null
  18.         { 
  19.             founded = FindChild<T>(d); 
  20.             if (founded != null
  21.                 break
  22.         } 
  23.         else 
  24.         { 
  25.             founded = childType; 
  26.             break
  27.         } 
  28.     } 
  29.  
  30.     return founded; 
		/// <summary>
		/// Find Child with Visual Tree
		/// </summary>
		/// <typeparam name="T">specail type</typeparam>
		/// <param name="root">the element starts</param>
		/// <returns></returns>
		public static T FindChild<T>(DependencyObject root) where T : DependencyObject
		{
			if (root == null)
				return null;

			T founded = null;

			for (int j = 0; j < VisualTreeHelper.GetChildrenCount(root); j++)
			{
				DependencyObject d = VisualTreeHelper.GetChild(root, j);
				T childType = d as T;
				if (childType == null)
				{
					founded = FindChild<T>(d);
					if (founded != null)
						break;
				}
				else
				{
					founded = childType;
					break;
				}
			}

			return founded;
		}

 

查找指定类型指定名称的子控件:

[csharp] view plain copy print ?
  1. /// <summary> 
  2. /// Find Child with Visual Tree 
  3. /// </summary> 
  4. /// <typeparam name="T">specail type</typeparam> 
  5. /// <param name="root">the element starts</param> 
  6. /// <returns></returns> 
  7. public static T FindChild<T>(DependencyObject root, string name) where T : DependencyObject 
  8.     if (root == null
  9.         return null
  10.  
  11.     T founded = null
  12.  
  13.     for (int j = 0; j < VisualTreeHelper.GetChildrenCount(root); j++) 
  14.     { 
  15.         DependencyObject d = VisualTreeHelper.GetChild(root, j); 
  16.         T childType = d as T; 
  17.         if (childType == null || ((d is FrameworkElement) && (d as FrameworkElement).Name != name)) 
  18.         { 
  19.             founded = FindChild<T>(d, name); 
  20.             if (founded != null
  21.                 break
  22.         } 
  23.         else 
  24.         { 
  25.             founded = childType; 
  26.             break
  27.         } 
  28.     } 
  29.  
  30.     return founded; 
		/// <summary>
		/// Find Child with Visual Tree
		/// </summary>
		/// <typeparam name="T">specail type</typeparam>
		/// <param name="root">the element starts</param>
		/// <returns></returns>
		public static T FindChild<T>(DependencyObject root, string name) where T : DependencyObject
		{
			if (root == null)
				return null;

			T founded = null;

			for (int j = 0; j < VisualTreeHelper.GetChildrenCount(root); j++)
			{
				DependencyObject d = VisualTreeHelper.GetChild(root, j);
				T childType = d as T;
				if (childType == null || ((d is FrameworkElement) && (d as FrameworkElement).Name != name))
				{
					founded = FindChild<T>(d, name);
					if (founded != null)
						break;
				}
				else
				{
					founded = childType;
					break;
				}
			}

			return founded;
		}

 


查找父控件:

[csharp] view plain copy print ?
  1. public static T FindParent<T>(DependencyObject d) where T : DependencyObject 
  2.     DependencyObject parent = d; 
  3.     while (parent != null
  4.     { 
  5.         parent = VisualTreeHelper.GetParent(parent); 
  6.         if (parent != null && (parent.GetType() == typeof(T))) 
  7.         { 
  8.             return parent as T; 
  9.         } 
  10.     } 
  11.     return parent as T; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值