在 WP7 应用程序中,我以递归方式使用 FrameworkElement.Parent 来确定特定元素是否在另一个元素内。但它并不总是能正常工作。
然后我将代码更改为递归使用 VisualtreeHelper.GetParent 方法,并且它始终正常工作(就我测试而言)。
那么它们有什么区别呢?
谢谢
最佳答案
考虑 ControlA
和 ControlB
其中 ControlA 是一个内容控件,这意味着它可以包含其他控件。
<ControlA>
<ControlB />
</ControlA>
在这种情况下,逻辑上 ControlB 实例的 Parent 属性是 ControlA 的一个实例。
但是,如果您查看
Template
ControlA 的默认样式的 setter 你可能会发现复杂的 Xaml 包含一些视觉状态管理和边界和网格的层次结构,最后埋在那里的是一个 ContentPresenter
将放置子控件的位置。递归循环 VisualTreeHelper.Parent 将从
ContentPresenter
中找到模板中定义的每个元素。直到“逻辑”父元素,然后超越。
关于.net - FrameworkElement.Parent 和 VisualtreeHelper.GetParent 的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6921881/