按名称查找控制父级

时间:2013-03-04 09:18:02

标签: wpf controls parent

当在xaml代码中设置名称时,有没有办法通过名称查找WPF控件的父级?

3 个答案:

答案 0 :(得分:8)

试试这个,

element = VisualTreeHelper.GetParent(element) as UIElement;   

其中, 元素是孩子 - 你需要得到谁的父母。

答案 1 :(得分:1)

在代码中,您可以使用VisualTreeHelper遍历控件的可视树。您可以像往常一样通过代码隐藏来识别控件的名称。

如果你想直接在XAML中使用它,我会尝试实现一个自定义的“值转换器”,您可以实现它来查找满足您要求的父控件,例如具有某种类型。

如果您不想使用值转换器,因为它不是“真正的”转换操作,您可以将'ParentSearcher'类实现为依赖项对象,它为“输入控件”提供依赖项属性,您的搜索谓词和输出控件,并在XAML中使用它。

这有帮助吗?

答案 2 :(得分:1)

实际上,我可以通过使用VisualTreeHelper按名称和类型来递归查找Parent控件来做到这一点。

    /// <summary>
    /// Recursively finds the specified named parent in a control hierarchy
    /// </summary>
    /// <typeparam name="T">The type of the targeted Find</typeparam>
    /// <param name="child">The child control to start with</param>
    /// <param name="parentName">The name of the parent to find</param>
    /// <returns></returns>
    private static T FindParent<T>(DependencyObject child, string parentName)
        where T : DependencyObject
    {
        if (child == null) return null;

        T foundParent = null;
        var currentParent = VisualTreeHelper.GetParent(child);

        do
        {
            var frameworkElement = currentParent as FrameworkElement;
            if(frameworkElement.Name == parentName && frameworkElement is T)
            {
                foundParent = (T) currentParent;
                break;
            }

            currentParent = VisualTreeHelper.GetParent(currentParent);

        } while (currentParent != null);

        return foundParent;
    }