如何在WPF中遍历一组自定义控件对象?

时间:2010-01-05 08:42:54

标签: c# wpf loops object custom-controls

在我的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 ???)
{
 ....

}

2 个答案:

答案 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);