using System.Windows; using System.Windows.Media; namespace System.Windows.Forms { public static class WpfHelper { public static T FindAncestor(DependencyObject obj) where T : class { var parent = VisualTreeHelper.GetParent(obj); if (parent == null) return null; if (parent is T) return parent as T; return FindAncestor(parent); } public static T FindParent(FrameworkElement obj) where T : class { var parent = obj.Parent as FrameworkElement; if (parent == null) return null; if (parent is T) return parent as T; return FindParent(parent); } public static T GetChildOfType(this DependencyObject depObj) where T : DependencyObject { if (depObj == null) return null; for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) { var child = VisualTreeHelper.GetChild(depObj, i); var result = (child as T) ?? GetChildOfType(child); if (result != null) return result; } return null; } public static Rect BoundsRelativeTo(this FrameworkElement child, Visual parent) { var gt = child.TransformToAncestor(parent); return gt.TransformBounds(new Rect(0, 0, child.ActualWidth, child.ActualHeight)); } } }