using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Media; namespace CustomUI.Utils { public class VisualHelper { /// /// 查找元素的子元素 /// /// 子元素类型 /// /// public static T FindVisualChild(DependencyObject obj) where T : DependencyObject { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { DependencyObject child = VisualTreeHelper.GetChild(obj, i); if (child != null && child is T) return (T)child; else { T childOfChild = FindVisualChild(child); if (childOfChild != null) return childOfChild; } } return null; } /// /// 得到指定元素的集合 /// /// /// /// public static IEnumerable FindVisualChildren(DependencyObject depObj) where T : DependencyObject { if (depObj != null) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) { DependencyObject child = VisualTreeHelper.GetChild(depObj, i); if (child != null && child is T) { yield return (T)child; } foreach (T childOfChild in FindVisualChildren(child)) { yield return childOfChild; } } } } /// /// 利用visualtreehelper寻找对象的子级对象 /// /// /// /// public static List FindVisualChildrenEx(DependencyObject obj) where T : DependencyObject { try { List TList = new List { }; for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { DependencyObject child = VisualTreeHelper.GetChild(obj, i); if (child != null && child is T) { TList.Add((T)child); List childOfChildren = FindVisualChildrenEx(child); if (childOfChildren != null) { TList.AddRange(childOfChildren); } } else { List childOfChildren = FindVisualChildrenEx(child); if (childOfChildren != null) { TList.AddRange(childOfChildren); } } } return TList; } catch (Exception e) { return null; } } /// /// 查找元素的父元素 /// /// /// /// public static T FindParent(DependencyObject i_dp) where T : DependencyObject { DependencyObject dobj = (DependencyObject)VisualTreeHelper.GetParent(i_dp); if (dobj != null) { if (dobj is T) { return (T)dobj; } else { dobj = FindParent(dobj); if (dobj != null && dobj is T) { return (T)dobj; } } } return null; } public static T FindParent(DependencyObject i_dp, string elementName) where T : DependencyObject { DependencyObject dobj = (DependencyObject)VisualTreeHelper.GetParent(i_dp); if (dobj != null) { if (dobj is T && ((System.Windows.FrameworkElement)(dobj)).Name.Equals(elementName)) { return (T)dobj; } else { dobj = FindParent(dobj); if (dobj != null && dobj is T) { return (T)dobj; } } } return null; } /// /// 查找指定名称的元素 /// /// 元素类型 /// /// 元素名称,及xaml中的Name /// public static childItem FindVisualElement(DependencyObject obj, string elementName) where childItem : DependencyObject { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { DependencyObject child = VisualTreeHelper.GetChild(obj, i); if (child != null && child is childItem && ((System.Windows.FrameworkElement)(child)).Name.Equals(elementName)) return (childItem)child; else { IEnumerator j = FindVisualChildren(child).GetEnumerator(); while (j.MoveNext()) { childItem childOfChild = (childItem) j.Current; if (childOfChild != null && !(childOfChild as FrameworkElement).Name.Equals(elementName)) { FindVisualElement(childOfChild, elementName); } else { return childOfChild; } } } } return null; } /// /// 命中测试。根据当前选中元素,查找视觉树父节点与子节点,看是否存在指定类型的元素 /// /// 想命中的元素类型 /// 当前选中元素 /// true:命中成功 public static bool HitTest(DependencyObject dp) where T : DependencyObject { return FindParent(dp) != null || FindVisualChild(dp) != null; } public static T FindEqualElement(DependencyObject source, DependencyObject element) where T : DependencyObject { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(source); i++) { DependencyObject child = VisualTreeHelper.GetChild(source, i); if (child != null && child is T && child == element) { return (T)child; } else { T childOfChild = FindVisualChild(child); if (childOfChild != null) { return childOfChild; } } } return null; } } }