2009-11-23 10 views
7

Sto cercando un metodo affidabile per costruire un elenco di controlli di tipo <> contenuta in una specifica < Panel> controllo derivato - questo include quelli che sono figli diretti e quelli quali sono figli di bambini e così via.Silverlight: Trova tutti i controlli di tipo nel layout

Il modo più ovvio è stato quello di farlo solo in modo ricorsivo:
Aggiungi alla lista dei figli di questo controllo di tipo <>, quindi ripetere la funzione per ogni bambino di questo controllo, che è una < Panel> o discendente.

Tuttavia sono preoccupato che questo non troverà tutti i controlli nella struttura - qualsiasi ContentControl potrebbe contenere anche un controllo di < Tipo>, come potrebbe HeaderedContentControl o qualsiasi altro controllo simile con uno o più attributi figlio/contenuto .

Esiste un modo per eseguire una ricerca rispetto all'albero di layout effettivo, in modo che sia possibile trovare un'istanza di uno specifico tipo di controllo senza un genitore specifico?

risposta

20

Qui è un metodo di estensione piuttosto ingenua: -

public static class VisualTreeEnumeration 
{ 
    public static IEnumerable<DependencyObject> Descendents(this DependencyObject root) 
    { 
    int count = VisualTreeHelper.GetChildrenCount(root); 
    for (int i=0; i < count; i++) 
    { 
     var child = VisualTreeHelper.GetChild(root, i); 
     yield return child; 
     foreach (var descendent in Descendents(child)) 
     yield return descendent; 
    } 
    } 
} 

Questo approccio ha il sorteggio schiena che assume nessuna modifica avvengono nella composizione albero mentre la sua in corso. Questo potrebbe essere mitigato in uso usando una lista().

Ora è possibile effettuare le vostre esigenze utilizzando LINQ: -

var qryAllButtons = myPanel.Descendents().OfType<Button>(); 
+0

Sì, funziona bene. Grazie. – Jonx

+0

@AnthonyWJones quando utilizzo Descendents nessun controllo verrà retrunito per me, io sono trace e VisualTreeHelper.GetChildrenCount (root) restituirà 0 count, perché? –

1

Diciamo che si desidera trovare comboboxes all'interno di un UserControl che inizia con una griglia e ha nidificato griglie, stackpanels, tela, ecc contenenti comboboxes

  1. Imports System.Windows.Controls.Primitives (o usando per C#)
  2. Dim ListOfComboBoxes = MAINGRID.GetVisualDescendants.OfType(Of ComboBox)

Proprio così ...

+0

'GetVisualDescendants' non è nella distribuzione Silverlight principale AFAICT. (Nota nessuna definizione semplice in [MSDN] (http://google.com/search?q=GetVisualDescendants+site%3Amsdn.microsoft.com+-site%3Asocial.msdn.microsoft.com).) 'System.Windows.Controls .Toolkit' [sembra] (http://stackoverflow.com/a/7442356/256431) da richiedere. –

+0

System.Windows.Controls.Primitives è una parte di System.Windows.Controls nella seguente directory: c: \ Programmi (x86) \ Microsoft SDK \ Silverlight \ v5.0 \ Libraries \ Client \ System.Windows.Controls. dll. –

Problemi correlati