Hin und wieder sucht man ein Steuerelement in seiner WPF GUI und kämpft dann womöglich mit Templates usw. Diese Methode durchläuft einfach alle Controls aus dem Logical- und aus dem VisualTree, je nach Wert der optionalen Parameter.
Die Methode ist als Erweiterung für DependencyObject implementiert.
namespace System.Windows
{
using System.Collections.Generic;
using System.Linq;
using System.Windows.Media;
using System.Windows.Media.Media3D;
public static class DependencyObjectExtensions
{
/// <summary>
/// Durchläuft sämtliche Steuerelemente des angegebenen Elements.
/// </summary>
/// <param name="root">Das Element bei dme die Suche beginnt.</param>
/// <param name="visualTree"><c>true</c>, wenn der VisualTree durchsucht werden soll; andernfalls <c>false</c>. <c>true</c> ist der Standardwert.</param>
/// <param name="logicalTree"><c>true</c>, wenn der LogicalTree durchsucht werden soll; andernfalls <c>false</c>. <c>true</c> ist der Standardwert.></param>
/// <returns>Eine Aufzählung aller Unter-Objekte von <paramref name="root"/> die in einem den angegebenen Bäume zu finden sind.</returns>
public static IEnumerable<DependencyObject> GetChildren(this DependencyObject root, bool visualTree = true, bool logicalTree = true)
{
if (root == null)
yield break;
yield return root;
if (visualTree && (root is Visual || root is Visual3D))
{
var count = VisualTreeHelper.GetChildrenCount(root);
for (int i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(root, i);
foreach (var subChild in GetChildren(child, visualTree, logicalTree))
yield return subChild;
}
}
if (logicalTree)
{
if (root is FrameworkElement || root is FrameworkContentElement)
foreach (var child in LogicalTreeHelper.GetChildren(root).OfType<DependencyObject>())
{
foreach (var subChild in GetChildren(child, visualTree, logicalTree))
yield return subChild;
}
}
}
}
}
Kommentare zum Snippet