在WPF PRISM应用程序中查找所有区域中的所有控件

时间:2015-03-30 09:56:01

标签: c# wpf wpf-controls prism

我正在尝试将工具提示添加到我试过的WPF应用程序中的所有控件

foreach(IRegion region in _RegionManager.Regions)
{
    foreach(IView view in region.Views)
    {
        foreach(Control c in view.)//here my problem
            c.ToolTip = "some tooltip";
    }
}

这不起作用,因为我不知道在那种情况下我应该在哪里寻找控件。 谢谢你的任何建议。

1 个答案:

答案 0 :(得分:1)

在WPF中,应该通过XAML标记以声明方式定义视图。

您通常会在视图中定义工具提示:

<UIElement ToolTip="toolTipContent"/>

当然,您可以使用绑定:

<UIElement ToolTip="{Binding ToolTipText}"/>

请注意,Prism的IView接口不提供有关视图实例的实际类型的任何信息。它可以是PageUserControl甚至是TextBox

如果您愿意,您可以使用linq并仅获取这些视图,例如UserControl S:

foreach(UserControl view in region.Views.OfType<UserControl>())
{
    // do something...
}

但这并没有真正帮助你,因为在WPF中,没有像我们在Windows窗体中那样迭代UserControl的子元素的简单方法。

您可以使用VisualTreeHelper并遍历您的可视树寻找子元素,但这很尴尬:

void GetChildControls(IList<Visual> container, Visual parent)
{
    int childCount = VisualTreeHelper.GetChildrenCount(parent);

    for (int i = 0; i < childCount; i++)
    {
        Visual visual = (Visual)VisualTreeHelper.GetChild(parent, i);              
        container.Add(visual);

        if (VisualTreeHelper.GetChildrenCount(visual) > 0)
        {
            GetChildControls(container, visual);
        }
    }
}