using System.Collections.Generic; using System.Windows; using System.Windows.Input; using System.Windows.Media; namespace SJ.Controls.Extensions { public static class VisualTreeExtension { public static T HitTest(this FrameworkElement fe, Point? point) where T : FrameworkElement { if (point == null) point = Mouse.GetPosition(fe); var result = VisualTreeHelper.HitTest(fe, point.Value); if (result == null) return null; if (result.VisualHit != null) { var r = FindParentOfType(result.VisualHit); return r; } return null; } /// /// 查找父控件 /// /// 父控件类型 /// 子控件实例 /// public static T FindParentOfType(this DependencyObject obj) where T : FrameworkElement { DependencyObject parent = VisualTreeHelper.GetParent(obj); while (parent != null) { if (parent is T) { return (T)parent; } parent = VisualTreeHelper.GetParent(parent); } return null; } /// /// 查找子控件 /// /// 需要查找的控件类型 /// 父控件实例 /// public static T FindFirstVisualChild(this DependencyObject obj) where T : FrameworkElement { var queue = new Queue(); queue.Enqueue(obj); while (queue.Count > 0) { DependencyObject current = queue.Dequeue(); for (int i = VisualTreeHelper.GetChildrenCount(current) - 1; 0 <= i; i--) { DependencyObject child = VisualTreeHelper.GetChild(current, i); if (child != null && child is T) { return (T)child; } queue.Enqueue(child); } } return null; } } }