获取父级、同级、子级控件的类型、命名(转)

 1 using System.Windows.Media;
 2 
 3  /// <summary>
 4         /// 获取父级控件
 5         /// </summary>
 6         /// <typeparam name="T">类型 调用前需要预先指定</typeparam>
 7         /// <param name="obj">当前控件对象</param>
 8         /// <param name="name">要查找的父级控件的Name(Name为“ ”时,表示上一次父控件)</param>       
 9         public static T GetParentObject<T>(DependencyObject obj, string name=null) where T : FrameworkElement
10         {
11 
12             DependencyObject parent = VisualTreeHelper.GetParent(obj);
13 
14             //int i = 0;
15 
16             while (parent != null)
17             {
18 
19                 if (parent is T && (((T)parent).Name == name | string.IsNullOrEmpty(name)))
20                 {
21 
22                     return (T)parent;
23 
24                 }
25 
26                 parent = VisualTreeHelper.GetParent(parent);
27 
28             }
29 
30             return null;
31 
32         }                 
获取父级控件
 1 /// <summary>
 2         /// 通过委托来查找父级控件
 3         /// </summary>
 4         /// <typeparam name="T">事先指定的类型</typeparam>
 5         /// <param name="obj">基准对象</param>
 6         /// <param name="func">委托</param>
 7         /// <returns></returns>
 8         public static T GetParentObjectByDelegate<T>(DependencyObject obj, Func<T, bool> func) where T : FrameworkElement
 9         {
10             DependencyObject parent = VisualTreeHelper.GetParent(obj);
11             while (parent != null)
12             {
13                 if (parent is T && func(parent as T))//
14                 {
15 
16                     return (T)parent;
17 
18                 }
19                 parent = VisualTreeHelper.GetParent(parent);
20 
21             }
22             return null;
23 
24         }
通过委托来查找父级控件
 1  /// <summary>
 2         /// 获取当前控件的某个子级控件
 3         /// </summary>
 4         /// <typeparam name="T">事先指定的类型</typeparam>
 5         /// <param name="root">当前父级控件的Name</param>
 6         /// <returns></returns>      
 7         public static T FindChildOfType<T>(DependencyObject root, string name = null) where T : FrameworkElement
 8         {
 9 
10             var queue = new Queue<DependencyObject>();
11 
12             queue.Enqueue(root);
13 
14 
15             while (queue.Count > 0)
16             {
17 
18                 DependencyObject current = queue.Dequeue();
19 
20                 for (int i = VisualTreeHelper.GetChildrenCount(current) - 1; 0 <= i; i--)
21                 {
22 
23                     var child = VisualTreeHelper.GetChild(current, i);
24 
25                    // var typedChild = child as T;
26 
27                     //if (typedChild != null)
28                     //{
29 
30                     //    return typedChild;
31 
32                     //}
33                     if (child is T && (((T)child).Name == name | string.IsNullOrEmpty(name)))
34                     {
35 
36                         return (T)child;
37 
38                     }
39 
40                     queue.Enqueue(child);
41 
42                 }
43 
44             }
45 
46             return null;
47 
48         }
获取当前控件的某个子级控件
 1  /// <summary>
 2         /// 通过模糊名字来 获取当前控件的某个子级控件
 3         /// </summary>
 4         /// <typeparam name="T">事先指定的类型</typeparam>
 5         /// <param name="root">当前父级控件的Name</param>
 6         /// <returns></returns>      
 7         public static T FindChildOfTypeBySomeName<T>(DependencyObject root, string name =null) where T : FrameworkElement
 8         {
 9 
10             var queue = new Queue<DependencyObject>();
11 
12             queue.Enqueue(root);
13 
14 
15             while (queue.Count > 0)
16             {
17 
18                 DependencyObject current = queue.Dequeue();
19 
20                 for (int i = VisualTreeHelper.GetChildrenCount(current) - 1; 0 <= i; i--)
21                 {
22 
23                     var child = VisualTreeHelper.GetChild(current, i);
24 
25                     // var typedChild = child as T;
26 
27                     //if (typedChild != null)
28                     //{
29 
30                     //    return typedChild;
31 
32                     //}
33                     if (child is T && (((T)child).Name.Contains(name) | string.IsNullOrEmpty(name)))
34                     {
35 
36                         return (T)child;
37 
38                     }
39 
40                     queue.Enqueue(child);
41 
42                 }
43 
44             }
45 
46             return null;
47 
48         }
通过模糊名字来 获取当前控件的某个子级控件
 1 /// <summary>
 2         /// 获取当前控件的某类子级控件的集合
 3         /// </summary>
 4         /// <typeparam name="T">事先指定的类型</typeparam>
 5         /// <param name="root">当前父级控件的Name</param>
 6         /// <returns></returns>      
 7         public static List<T> FindListChildOfType<T>(DependencyObject root, string name = null) where T : FrameworkElement
 8         {
 9             List<T> result=new List<T>();
10             var queue = new Queue<DependencyObject>();
11 
12             queue.Enqueue(root);
13 
14             while (queue.Count > 0)
15             {
16 
17                 DependencyObject current = queue.Dequeue();
18 
19                 for (int i = VisualTreeHelper.GetChildrenCount(current) - 1; 0 <= i; i--)
20                 {
21 
22                     var child = VisualTreeHelper.GetChild(current, i);
23                    
24                     if (child is T && (((T)child).Name == name | string.IsNullOrEmpty(name)))
25                     {
26 
27                         result.Add((T)child);  //注意,这个List中的顺序并不是XAML中的结构顺序,而是其逆序哦!                   
28                     }
29 
30                     queue.Enqueue(child);
31 
32                 }
33 
34             }
35 
36             return result;            
37 
38         }
39        
获取当前控件的某类子级控件的集合
 1         //获取同级对象控件.  问题1:父级控件类型是什么?;2.同级的控件类型又是什么?
 2         public static T FindEquativeOfType<T>(DependencyObject obj, string name = null) where T : FrameworkElement
 3         {
 4 
 5             DependencyObject parentObj = GetParentObject<T>(obj);
 6 
 7             return (T)FindChildOfType<T>(parentObj, name);
 8 
 9 
10             //return null;
11 
12         }
13 
14      
获取同级对象控件
原文地址:https://www.cnblogs.com/5696-an/p/7583223.html