Frage

Ich bin auf der Suche nach einer zuverlässigen Methode eine Liste der Kontrollen von in einem bestimmten abgeleiteten Steuer enthalten zu bauen - dies schließt jene ein, die direkten Kinder sind, und die, die Kinder der Kinder sind und so weiter.

Der offensichtlichste Weg war es nur rekursiv tun:
Zur Liste hinzufügen Kinder dieser Steuerung von , dann Wiederholungsfunktion für jedes Kind dieser Kontrolle, die ein oder Nachkomme.

Jedoch habe ich besorgt bin, dass dies nicht alle Steuerelemente in dem Baum finden - jede Content auch einer Kontrolle enthalten könnte, so könnte HeaderedContentControl oder jede andere ähnliche Steuerung mit einem oder mehreren Kind / Inhaltsattribute.

Gibt es irgendwelche Mittel, um eine Suche gegen die tatsächliche Layout Baum ausgeführt wird, so dass jeder Instanz einer bestimmten Art von Kontrolle ohne bestimmten übergeordneten enthalten sind, können gefunden werden?

War es hilfreich?

Lösung

Hier ist eine ziemlich naive Extension-Methode: -

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

Dieser Ansatz hat den Nachteil hat, dass es keine Veränderungen passieren in der Baum Mitgliedschaft während seiner laufenden annimmt. Dies könnte durch die Verwendung eines ToList in Gebrauch gemildert werden ().

Jetzt können Sie Ihre Anforderungen bewirken LINQ mit: -

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

Andere Tipps

Lassen Sie uns sagen wollen Sie Comboboxen in einem Usercontrol finden, die mit einem GRID beginnt und Netzschachtelung, stackpanels, Leinwand usw. enthält, Comboboxen

  1. Imports System.Windows.Controls.Primitives (oder Verwendung für C #)
  2. Dim ListOfComboBoxes = MAINGRID.GetVisualDescendants.OfType(Of ComboBox)

Das ist es ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top