在我的WPF应用程序的窗口中,我有许多从自定义控件中获取的对象:
...
<MyNamespace:MyCustControl x:Name="x4y3" />
<MyNamespace:MyCustControl x:Name="x4y4" />
<MyNamespace:MyCustControl x:Name="x4y5" />
<MyNamespace:MyCustControl x:Name="x4y6" />
<MyNamespace:MyCustControl x:Name="x4y7" />
...
在我的代码中,我可以通过名称轻松引用每个代码:
x1y1.IsSelected = true;
在我的代码中,如何在循环中迭代它们的整个集合?
foreach (... in ???)
{
....
}
答案 0 :(得分:3)
您可以使用VisualTreeHelper或LogicalTreeHelper扫描窗口或页面的所有内容并找到特定控件(可能通过检查其类型是否为MyCustControl
private IEnumerable<MyCustControl> FindMyCustControl(DependencyObject root)
{
int count = VisualTreeHelper.GetChildrenCount(root);
for (int i = 0; i < count; ++i)
{
DependencyObject child = VisualTreeHelper.GetChild(root, i);
if (child is MyCustControl)
{
yield return (MyCustControl)child;
}
else
{
foreach (MyCustControl found in FindMyCustControl(child))
{
yield return found;
}
}
}
}
答案 1 :(得分:0)
很好的解决方案,对于那些想要它的通用版本的人来说 - 稍作改动可能会有所帮助:
public static class ControlFinder<T>
{
public static IEnumerable<T> FindControl(DependencyObject root)
{
int count = VisualTreeHelper.GetChildrenCount(root);
for (int i = 0; i < count; ++i)
{
dynamic child = VisualTreeHelper.GetChild(root, i);
if (child is T)
{
yield return (T)child;
}
else
{
foreach (T found in FindControl(child))
{
yield return found;
}
}
}
}
}
可以通过以下方式调用:
IEnumerable<MyType> mytypes = ControlFinder<MyType>.FindControl(root);