2009-11-23 12 views
7

Poszukuję niezawodnej metody do zbudowania listy kontrolnej < Typ> zawartej w konkretnej kontrolce <> pochodnej - obejmuje to te, które są bezpośrednimi dziećmi, oraz które są dziećmi dzieci i tak dalej.Silverlight: Znajdź wszystkie formanty typu w layoucie

Najbardziej oczywistym sposobem było po prostu to zrobić rekurencyjnie:
Dodaj do listy żadnych dzieci z tej kontroli < typ>, a następnie powtórzyć funkcję dla każdego dziecka z tej kontroli, która jest < panel> lub potomkiem.

Obawiam się jednak, że nie będzie można znaleźć wszystkich elementów sterujących w drzewie - dowolna kontrolka ContentControl może również zawierać formant < Typ>, podobnie jak HeaderedContentControl lub dowolne inne podobne sterowanie z jednym lub większą liczbą atrybutów podrzędnych/treściowych .

Czy istnieje sposób przeprowadzenia wyszukiwania z faktycznym drzewem układu, aby można było znaleźć instancjędowolnej instancji o nazwie określonej bez elementu nadrzędnego?

Odpowiedz

20

Tutaj jest dość naiwna metoda rozszerzenie: -

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; 
    } 
    } 
} 

Takie podejście ma cofać, że nie ponosi żadnej zmiany zachodzą w składzie drzewa podczas jej w toku. To może być złagodzone w użyciu przy użyciu ToList().

Teraz można dokonywać swoich wymagań przy użyciu LINQ: -

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

Tak, działa ładnie. Dziękuję Ci. – Jonx

+0

@AnthonyWJones, gdy używam Descendents, żadna kontrola mnie nie powtórzy, jestem trace i VisualTreeHelper.GetChildrenCount (root) zwróci 0 count, why? –

1

Powiedzmy chcesz znaleźć comboboxes wewnątrz UserControl który rozpoczyna się z siatką i zagnieżdżone kraty, stackpanels, płótno itp zawierające comboboxes

  1. Imports System.Windows.Controls.Primitives (lub za pomocą C#)
  2. Dim ListOfComboBoxes = MAINGRID.GetVisualDescendants.OfType(Of ComboBox)

To wszystko ...

+0

'GetVisualDescendants' nie znajduje się w głównej dystrybucji AFAICT. (Uwaga: nie ma prostej definicji w [MSDN] (http://google.com/search?q=GetVisualDescendants+site%3Amsdn.microsoft.com+-site%3Asocial.msdn.microsoft.com).) 'System.Windows.Controls .Toolkit' [wydaje się] (http://stackoverflow.com/a/7442356/256431) być wymagane. –

+0

System.Windows.Controls.Primitives jest częścią System.Windows.Controls w następującym katalogu: c: \ Program Files (x86) \ Microsoft SDK \ Silverlight \ v5.0 \ Libraries \ Client \ System.Windows.Controls. dll. –

Powiązane problemy