Silverlight: Hier finden Sie alle Steuerelemente des Typs in Layout
-
21-09-2019 - |
Frage
Ich bin auf der Suche nach einer zuverlässigen Methode eine Liste der Kontrollen von
Der offensichtlichste Weg war es nur rekursiv tun:
Zur Liste hinzufügen Kinder dieser Steuerung von
Jedoch habe ich besorgt bin, dass dies nicht alle Steuerelemente in dem Baum finden - jede Content auch einer Kontrolle
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?
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
-
Imports System.Windows.Controls.Primitives
(oder Verwendung für C #) -
Dim ListOfComboBoxes = MAINGRID.GetVisualDescendants.OfType(Of ComboBox)
Das ist es ...