Feedback

C# - WPF über alle Controls iterieren

Veröffentlicht von am 5/20/2015
(0 Bewertungen)
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

 

Logge dich ein, um hier zu kommentieren!