C# 如何从CustomControl内部查找CustomControl的父级
我有一个类在WPF中扩展了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将在多个实例中使用,我希望
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;
}