如何从CustomControl内部查找CustomControl的父级

时间:2018-07-27 15:07:52

标签: c# wpf visual-tree

我有一个在WPF中扩展Canvas的类。

该课程放在ScrollViewer中。

我没有在ScrollViewer中传递对Canvas的特定引用,我想从ScrollViewer本身中找到包含Canvas的{​​{1}}

扩展Canvas的类的Parent属性为Canvas,每次使用null的尝试也会返回VisualTreeHelper

我尝试使用null查找视觉祖先,但是parent属性为null。

由于VisualTreeHelper.GetParent(this)将在多个实例中使用,我希望它能够解析其包含的ExtendedCanvas,而无需在后面的代码或在XAML中。

我意识到我可以在ScrollViewer中添加一个依赖属性,并在ScrollViewer中创建一个绑定,但是我希望该组件可以通过简单地将其放入容器中来工作。

类似地,我不会反对将ExtendedCanvas放在某种面板上,然后将XAML放在其中,以使我的组件使用该面板作为其最低的包含元素。 / p>

让我感到困惑的是,据我了解,ScrollViewer将在正在运行的应用程序的整个可视树中导航。似乎我的假设是完全错误的,或者只能从指定的组件向下导航。

如果没有上述方法,是否有可能实现?

示例代码:

cs-

ExtendedCanvas

xaml-

VisualTreeHelper

1 个答案:

答案 0 :(得分:3)

您可以找到其父级,如下所示:

    public ExtendedCanvas()
    {
        //it hasn't been added to its parent yet
        Loaded += ExtendedCanvas_Loaded;
    }

    private void ExtendedCanvas_Loaded(object sender, RoutedEventArgs e)
    {
        //now it is added to its parent
        _containingScrollViewer  = Parent as ScrollViewer;
    }