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

How to find the Parent of a CustomControl from inside the CustomControl

我有一个 class,它在 WPF 中扩展了 Canvas

这个class放在一个ScrollViewer.

在不将对 ScrollViewer 的特定引用传递到 Canvas 的情况下,我想从 Canvas 中找到包含 CanvasScrollViewer ]本身。

Canvas 的 class 的 Parent 属性 是 null,每次尝试使用 VisualTreeHelper 都只是 returns null 还有

我试图使用 VisualTreeHelper.GetParent(this) 找到视觉祖先,但是父 属性 为空。

由于 ExtendedCanvas 将在多个实例中使用,我希望它能够解析其包含的 ScrollViewer 而无需在任一代码中专门引用 ScrollViewer在 XAML.

后面或里面

我意识到我可以在 ExtendedCanvas 中添加一个依赖项 属性 并在 XAML 中创建一个绑定,但是我希望该组件只需将其放入一个容器。

同样,我不反对将 ScrollViewer 放在某种面板上,然后将我的 ExtendedCanvas 放在其中,以便我的组件使用该面板作为其最低包含元素.

令我困惑的是,据我了解,VisualTreeHelper 将为 运行 应用程序导航整个可视化树。看来要么我的假设完全错误,要么只能从指定组件向下导航。

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

示例代码:

cs-

public class ExtendedCanvas:Canvas {

    //I wish to automatically populate this scroll viewer
    //reference to the instance of the scrollviwer which contains
    //this ExtendedCanvas instance
    private ScrollViewer _containingScrollViewer = null;

}

xaml -

    <ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" >
        <local:ExtendedCanvas x:Name="extendedCanvas" />
    </ScrollViewer>

你可以这样找到它的父级:

    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;
    }