WPF: How do I loop through the all controls in a window?

前端 未结 5 1018
无人及你
无人及你 2020-11-27 05:52

How do I loop through the all controls in a window in WPF?

5条回答
  •  臣服心动
    2020-11-27 06:42

    This way is superior to the MSDN method, in that it's reusable, and it allows early aborting of the loop (i.e. via, break;, etc.) -- it optimizes the for loop in that it saves a method call for each iteration -- and it also lets you use regular for loops to loop through a Visual's children, or even recurse it's children and it's grand children -- so it's much simpler to consume.

    To consume it, you can just write a regular foreach loop (or even use LINQ):

    foreach (var ctrl in myWindow.GetChildren())
    {
        // Process children here!
    }
    

    Or if you don't want to recurse:

    foreach (var ctrl in myWindow.GetChildren(false))
    {
        // Process children here!
    }
    

    To make it work, you just need put this extension method into any static class, and then you'll be able to write code like the above anytime you like:

    public static IEnumerable 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;
                        }
                    }
                }
            }
        }
    }
    

    Also, if you don't like recursion being on by default, you can change the extension method's declaration to have recurse = false be the default behavior.

提交回复
热议问题