如何从 CustomControl 内部找到 CustomControl 的父级
How to find the Parent of a CustomControl from inside the CustomControl
我有一个 class,它在 WPF 中扩展了 Canvas
。
这个class放在一个ScrollViewer
.
在不将对 ScrollViewer
的特定引用传递到 Canvas
的情况下,我想从 Canvas
中找到包含 Canvas
的 ScrollViewer
]本身。
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;
}
我有一个 class,它在 WPF 中扩展了 Canvas
。
这个class放在一个ScrollViewer
.
在不将对 ScrollViewer
的特定引用传递到 Canvas
的情况下,我想从 Canvas
中找到包含 Canvas
的 ScrollViewer
]本身。
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;
}