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.
Approfondimenti
I più letti di oggi
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Esaminare documenti XML con namespace utilizzando LINQ to XML
- Sfruttare una CDN con i bundle di ASP.NET
- Effetto turnstile su tutte le pagine con il Windows Phone Toolkit
- Le DirectInk API nella Universal Windows Platform
- Gli oggetti CallOut di Expression Blend 4.0


