Yes, Linq extension methods are what you need, but first you need to install the litte infrastructure: -
public static class VisualTreeEnumeration { public static IEnumerable<DependencyObject> Descendents(this DependencyObject root, int depth) { int count = VisualTreeHelper.GetChildrenCount(root); for (int i = 0; i < count; i++) { var child = VisualTreeHelper.GetChild(root, i); yield return child; if (depth > 0) { foreach (var descendent in Descendents(child, --depth)) yield return descendent; } } } public static IEnumerable<DependencyObject> Descendents(this DependencyObject root) { return Descendents(root, Int32.MaxValue); } public static IEnumerable<DependencyObject> Ancestors(this DependencyObject root) { DependencyObject current = VisualTreeHelper.GetParent(root); while (current != null) { yield return current; current = VisualTreeHelper.GetParent(current); } } }
Now you can use Linq to query the visual tree using Linq. Some examples: -
// Get all text boxes in usercontrol:- this.Descendents().OfType<TextBox>(); // All UIElement direct children of the layout root grid:- LayoutRoot.Descendents(0).OfType<UIElement>(); // Find the containing `ListBoxItem` for an element:- elem.Ancestors().OfType<ListBoxItem>.FirstOrDefault(); // Seek button with name "PinkElephants" even if outside of the current Namescope:- this.Descendents() .OfType<Button>() .FirstOrDefault(b => b.Name == "PinkElephants");
source share