public static T FindLogicalAncestor <T>(DependencyObject obj, Func <T, bool> filter = null) where T : DependencyObject { filter = filter ?? (depObj => true); while (obj != null) { T o = obj as T; if (o != null && filter(o)) { return(o); } obj = LogicalTreeHelper.GetParent(obj); if (obj != null && UIEventHubProperties.GetSkipLookup(obj)) { obj = null; } } return(default(T)); }
//http://stackoverflow.com/questions/665719/wpf-animate-listbox-scrollviewer-horizontaloffset public static T FindVisualChild <T>(DependencyObject obj, Func <T, bool> filter = null, int level = -1) where T : DependencyObject { if (filter == null) { filter = (t) => true; } // Search immediate children first (breadth-first) for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { DependencyObject child = VisualTreeHelper.GetChild(obj, i); if (child != null && child is T && filter((T)child)) { return((T)child); } else { if (level == -1 || level > 0) { if (!UIEventHubProperties.GetSkipLookup(child)) { T childOfChild = FindVisualChild <T>(child, filter, level == -1 ? -1 : level - 1); if (childOfChild != null) { return(childOfChild); } } } //else // Debug.WriteLine(child); } } return(null); }