
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