Extension Method con generics per ottenere una lista di figli di uno specifico tipo da un controllo in Silverlight 4.0

di Davide Guida, in Silverlight 4.0,

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).

C#
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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

Nessuna risorsa collegata

I più letti di oggi