Wie durchlaufe ich alle Steuerelemente in einem Fenster in WPF?WPF: Wie durchlaufe ich alle Steuerelemente in einem Fenster?
Antwort
Klasse eine Liste aller Kinder Komponenten einer Kontrolle zu bekommen:
class Utility
{
private static StringBuilder sbListControls;
public static StringBuilder GetVisualTreeInfo(Visual element)
{
if (element == null)
{
throw new ArgumentNullException(String.Format("Element {0} is null !", element.ToString()));
}
sbListControls = new StringBuilder();
GetControlsList(element, 0);
return sbListControls;
}
private static void GetControlsList(Visual control, int level)
{
const int indent = 4;
int ChildNumber = VisualTreeHelper.GetChildrenCount(control);
for (int i = 0; i <= ChildNumber - 1; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(control, i);
sbListControls.Append(new string(' ', level * indent));
sbListControls.Append(v.GetType());
sbListControls.Append(Environment.NewLine);
if (VisualTreeHelper.GetChildrenCount(v) > 0)
{
GetControlsList(v, level + 1);
}
}
}
}
Das Durchschleifen eines logischen Baums ist nicht besser und effizienter als das Durchlaufen eines visuellen Baums. – MegaMind
'sbListControls' sollte eine lokale Variable sein, falls diese Methoden gleichzeitig von mehreren Threads aufgerufen werden. –
Ich fand dies in der MSDN documenation so hilft es.
// Enumerate all the descendants of the visual object.
static public void EnumVisual(Visual myVisual)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(myVisual); i++)
{
// Retrieve child visual at specified index value.
Visual childVisual = (Visual)VisualTreeHelper.GetChild(myVisual, i);
// Do processing of the child visual object.
// Enumerate children of the child visual object.
EnumVisual(childVisual);
}
}
Sieht einfacher für mich. Ich habe es verwendet, um Textfelder in einem Formular zu finden und ihre Daten zu löschen.
posted ich eine andere Antwort auf dieser Basis, die tatsächlich gibt ein 'IEnumerable
Wenn ich versuche, das ich einen Fehler zu reproduzieren, erhalten auf myVisual (dh .GetChildrenCount (** myVisual **) & .GetChild (** myVisual ** i)) sagen „kann nicht von‚Windows.UI.Composition.Visual konvertieren 'zu' Windows.UI.Xaml.DependencyObject '"? Funktionieren WPF-Lösungen in der UWP-Umgebung? Verwende ich die falsche using-Direktive (Windows.UI.Composition)? – gaw
Eine leichte Variation auf der MSDN-Antwort ... geben Sie einfach in eine leere Liste von Visual Objekte hinein und Ihre Sammlung wird mit allen Kind Visuals werden bevölkert:
/// <summary>
/// Enumerate all the descendants (children) of a visual object.
/// </summary>
/// <param name="parent">Starting visual (parent).</param>
/// <param name="collection">Collection, into which is placed all of the descendant visuals.</param>
public static void EnumVisual(Visual parent, List<Visual> collection)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
// Get the child visual at specified index value.
Visual childVisual = (Visual)VisualTreeHelper.GetChild(parent, i);
// Add the child visual object to the collection.
collection.Add(childVisual);
// Recursively enumerate children of the child visual object.
EnumVisual(childVisual, collection);
}
}
posted ich eine andere Antwort, basierend auf Ihr, die tatsächlich einen 'IEnumerable gibt
Auf diese Weise überlegen ist die MSDN-Methode, in der es wiederverwendbar ist, und es ermöglicht einen frühen Abbruch der Schleife (zB via, break;
, etc.) - es optimiert die for-Schleife in dem es einen Methodenaufruf für jede Iteration speichert - und Sie können es auch verwenden Regelmäßige for-Schleifen, um die Kinder eines Visual zu durchlaufen, oder sogar die Kinder und die Enkelkinder zu rekursieren - es ist also viel einfacher zu konsumieren.
es zu verbrauchen, können Sie einfach eine regelmäßige foreach-Schleife schreiben (oder sogar LINQ):
foreach (var ctrl in myWindow.GetChildren())
{
// Process children here!
}
Oder, wenn Sie nicht Rekursion wollen:
esforeach (var ctrl in myWindow.GetChildren(false))
{
// Process children here!
}
zu machen Arbeit, Sie müssen nur diese Erweiterung Methode in jede statische Klasse setzen, und dann werden Sie in der Lage sein, Code wie die oben jederzeit schreiben Sie mögen:
public static IEnumerable<Visual> GetChildren(this Visual parent, bool recurse = true)
{
if (parent != null)
{
int count = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < count; i++)
{
// Retrieve child visual at specified index value.
var child = VisualTreeHelper.GetChild(parent, i) as Visual;
if (child != null)
{
yield return child;
if (recurse)
{
foreach (var grandChild in child.GetChildren(true))
{
yield return grandChild;
}
}
}
}
}
}
Wenn Sie nicht möchten, dass die Rekursion standardmäßig aktiviert ist, können Sie die Deklaration der Erweiterungsmethode so ändern, dass recurse = false
das Standardverhalten ist.
Ich habe folgendes zu bekommen alle Kontrollen verwendet.
public static IList<Control> GetControls(this DependencyObject parent)
{
var result = new List<Control>();
for (int x = 0; x < VisualTreeHelper.GetChildrenCount(parent); x++)
{
DependencyObject child = VisualTreeHelper.GetChild(parent, x);
var instance = child as Control;
if (null != instance)
result.Add(instance);
result.AddRange(child.GetControls());
}
return result;
}
- 1. Suche alle Steuerelemente in WPF-Fenster nach Typ
- 2. Wie durchlaufe ich alle Dateien in einem Ordner mit C?
- 3. jQuery: Wie durchlaufe ich alle 'a' Elemente?
- 4. Wie kann ich die Steuerelemente in einem WPF-Fenster schnell ausrichten?
- 5. Wie kann ich WPF-Steuerelemente in einem Hintergrundthread erstellen?
- 6. WPF-Layout auf einem Fenster
- 7. Hat WPF gleichwertige Steuerelemente für alle Winforms-Steuerelemente?
- 8. WPF-Steuerelemente Dll Frage
- 9. Wie programmiere ich den Titel in einem wpf-Fenster programmatisch?
- 10. SlimDX Ansichtsfenster in WPF-Steuerelemente
- 11. Wie durchlaufe ich eine Enum in Java?
- 12. Wie durchlaufe ich verschachtelte Kinderstruktur?
- 13. WPF: Wie können Steuerelemente in einem StackPanel gedehnt werden?
- 14. Benutzerdefinierbare WPF-Steuerelemente?
- 15. WPF: Benutzerdefiniertes Fenster
- 16. Wie durchlaufe ich ein Array in Java?
- 17. WPF-Composite-Steuerelemente
- 18. Aktualisiertes Element/Steuerelement in einem WPF-Fenster
- 19. ein Fenster von einem anderen in Wpf
- 20. Alle WPF Gauge-Steuerelemente, die Open Source sind?
- 21. Wie die Steuerelemente gemäß der Seitengröße in WPF
- 22. Umgang mit einem Klick für alle Steuerelemente in einem Formular
- 23. Müssen ein Fenster in einem anderen Fenster unter WPF
- 24. WPF-Fenster wird schwarz
- 25. Wie erstellt man ein Template-Fenster in WPF?
- 26. wpf: mehrere Steuerelemente über Dispatcher aktualisieren
- 27. WPF-Datennavigations-Steuerelemente
- 28. Wie durchlaufe ich einen Datumsbereich rückwärts?
- 29. Conditional Laden von WPF-Steuerelemente
- 30. WPF: Ändern der Schriftart aller Steuerelemente in einem bestimmten Container
könnte Dieser Link einen guten Anfang sein: http://msdn.microsoft.com/en-us/library/bb613556.aspx – VVS
Sie die Antwort in finden: http://stackoverflow.com/questions/974598/find-all-controls-in-wpf-window-by-type –