Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从CustomControl内部查找CustomControl的父级_C#_Wpf_Visual Tree - Fatal编程技术网

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

C# 如何从CustomControl内部查找CustomControl的父级,c#,wpf,visual-tree,C#,Wpf,Visual Tree,我有一个类在WPF中扩展了Canvas 此类放置在滚动查看器中 在不将对ScrollViewer的特定引用传递到Canvas的情况下,我想从Canvas本身中找到包含Canvas的ScrollViewer 扩展Canvas的类的Parent属性是null,每次尝试使用VisualTreeHelper时也只返回null 我尝试使用visualtreeheloper.GetParent(this)查找可视祖先,但是parent属性为null 由于ExtendedCanvas将在多个实例中使用,我希望

我有一个类在WPF中扩展了
Canvas

此类放置在
滚动查看器中

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

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

我尝试使用
visualtreeheloper.GetParent(this)
查找可视祖先,但是parent属性为null

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

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

类似地,我也不反对将
ScrollViewer
放在某种面板上,然后将我的
ExtendedCanvas
放在其中,这样我的组件就可以使用该面板作为它的最低包含元素

让我困惑的是,据我所知,
visualtreeheloper
将为正在运行的应用程序导航整个可视化树。似乎要么我的假设完全错误,要么它只能从指定的组件向下导航

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

示例代码:

cs-

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

但是,当我从构造函数中检查父属性时,我仍然有点不明白为什么父属性为null。我最好的猜测是,直到构造函数返回后,才设置父级。我的假设正确吗?是的。在构造函数中,尚未将其添加到其父级
    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;
    }