循环访问具有嵌套层次结构的 WPF 窗口控件



我必须遍历WPF窗口的所有控件(我找到了如何做到这一点),但真正的问题是控件的嵌套结构:它们都是网格,堆栈面板,选项卡页面等的一部分。几次。我想执行这样的迭代,因为我想实现一种 GUI 链接的设置系统。

我的尝试如下:

public List<Control> GetAllControls(DependencyObject dependency)
    {
        List<Control> controls = new List<Control>();
        for (int loop = 0; loop < VisualTreeHelper.GetChildrenCount(dependency); loop++)
        {
            if (VisualTreeHelper.GetChildrenCount(VisualTreeHelper.GetChild(dependency, loop)) > 0)
                controls.Concat(GetAllControls(VisualTreeHelper.GetChild(dependency, loop)));
            else
                controls.Add((Control)VisualTreeHelper.GetChild(dependency, loop));
        }
        return controls;
    } 

但是,GetChildrenCount始终为 0,尽管给定参数有 7 个项目(智能感知表示)。

由于以下行,您的代码不起作用:

controls.Concat(GetAllControls(VisualTreeHelper.GetChild(dependency, loop)));

Concat 是一个 LINQ 扩展方法,它将返回一个新序列,该序列是两个序列(原始序列(在本例中为controls序列)和提供给该方法的序列)的串联。您不会将返回的序列分配给任何内容。

您需要的是 List<T> 类的 AddRange 方法。 将代码行更改为:

controls.AddRange(GetAllControls(VisualTreeHelper.GetChild(dependency, loop)));

我认为这应该可以解决问题。

最新更新