我必须遍历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)));
我认为这应该可以解决问题。