Scaling Silverlight and the Visual Tree

Now there may be more problems than it costs, but, nevertheless, it would be really useful for me right now.

I would like to know how I can manipulate the Silverlight visual tree at runtime. Doing simple things, such as adding and removing controls, is quite simple, but when you have to go through the tree with any reasonable complexity, I’m waiting for the JQuery style syntax (LINQ will be pretty cool, I suppose) to handle the DOM node replacement, movement etc.

So, I think, the question is, are there any libraries there to make this an easier job, or is there something baked into what I missed?

+4
source share
4 answers

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"); 
+6
source

You may be interested in implementing LINQ to Visual Tree .

+2
source

what version of silverlight? And what year is "December 13 at 13:13" is this message dated?

the current version of SL4 does not seem to be there.

0
source

I use this code to get controls from a visual tree

  public static FrameworkElement GetComponent(object child, Type t, Type bailOn) { if (child == null) return null; DependencyObject control = (DependencyObject)child; // VisualTreeHelper.GetParent((DependencyObject)x); while (control != null) { if (!control.Equals(child)) { if (control.GetType() == t) { break; } } if (control is FrameworkElement) { control = (control as FrameworkElement).Parent; } else if ((control is DataGridBoundColumn)) // data grid fucken columns { control = GetDataGridBoundColumnDataGrid(control); } if (control != null && bailOn != null && bailOn.GetType() == control.GetType()) { return null; } } // try VTH as we did not find it, as that works some times and the above does not if (control == null) { control = (DependencyObject)child; // start again while (control != null) { if (!control.Equals(child)) { if (control.GetType() == t) { break; } } if (control is FrameworkElement) { control = VisualTreeHelper.GetParent((control as FrameworkElement)); } else if (control is DataGridBoundColumn) { control = GetDataGridBoundColumnDataGrid(control); } if (control != null && bailOn != null && bailOn.GetType() == control.GetType()) { return null; } } } return control as FrameworkElement; } public static List<FrameworkElement> GetComponentsByType(FrameworkElement parent, Type type) { List<FrameworkElement> controls = new List<FrameworkElement>(); GetComponentsByTypeWorker(parent, type, controls); return controls; } private static void GetComponentsByTypeWorker(FrameworkElement parent, Type type, List<FrameworkElement> controls) { if (parent.GetType() == type) { controls.Add(parent as FrameworkElement); } int cnt = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < cnt; i++) { FrameworkElement child = VisualTreeHelper.GetChild(parent, i) as FrameworkElement; if (child.GetType() == type) { controls.Add(child as FrameworkElement); } int cnt2 = VisualTreeHelper.GetChildrenCount(child); for (int j = 0; j < cnt2; j++) { FrameworkElement child2 = VisualTreeHelper.GetChild(child, j) as FrameworkElement; GetComponentsByTypeWorker(child2 as FrameworkElement, type, controls); } } } 
0
source

All Articles