Durante lo sviluppo di un'applicazione Silverlight, può capitare di avere la necessità di manipolare tutti gli elementi di un determinato tipo che appartengono all'albero dei controlli. Immaginiamo ad esempio di voler modificare programmaticamente lo stile applicato a tutti i TextBlock contenuti all'interno di uno StackPanel.
Nello script di oggi presentiamo un approccio che consente, partendo da un particolare FrameworkElement, di scorrere l'albero degli elementi e restituire una collezione di controlli di un particolare tipo, sfruttando una combinazione di Extension Methods, Generics e programmazione ricorsiva.
E' possibile quindi utilizzare questa soluzione per scorrere i discendenti di un particolare controllo, in maniera molto più semplice che attraverso le relative property di navigazione ( Children, Content, Items e così via). Inoltre, siccome il valore restituito è una collezione IEnumerable, è possibile combinarlo in un'espressione LINQ (ad esempio per disabilitare tutti i checkbox di un particolare pannello).
public static class Extensions { public static IEnumerable<T> GetChildren<T>(this FrameworkElement element) where T : FrameworkElement { int count = VisualTreeHelper.GetChildrenCount(element); for (int i = 0; i != count; ++i) { var child = VisualTreeHelper.GetChild(element, i) as FrameworkElement; if (child is T) yield return (T)child; var children = child.GetChildren<T>(); foreach (T grandchild in children) yield return grandchild; } } }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.