在WP7应用程序中,我以递归方式使用FrameworkElement.Parent来确定特定元素是否在另一个元素内。但它并不总是正常工作。 然后我改变了我的代码,以递归方式使用VisualtreeHelper.GetParent方法,并且它始终正常工作(就我测试而言)。
那么它们的区别是什么?
由于
答案 0 :(得分:4)
考虑ControlA
和ControlB
,其中ControlA是一个内容控件,意味着它可以包含其他控件。
<ControlA>
<ControlB />
</ControlA>
逻辑上,在这种情况下,ControlB实例的Parent属性是ControlA的实例。
但是,如果您要查看ControlA的默认样式的Template
setter,您可能会发现包含一些可视状态管理和Borders和Grids层次结构的复杂Xaml,并最终隐藏在该批次中有{{{ 1}}将放置子控件。
以递归方式循环VisualTreeHelper.Parent将找到模板中定义的每个元素,从ContentPresenter
到“逻辑”父元素,然后超出。
答案 1 :(得分:1)
“Silverlight中FrameworkElement.Parent属性报告的值通常与使用VisualTreeHelper API报告的值相同,因为两个树概念经常同步报告父子关系的方式。但是,可能存在FrameworkElement.Parent报告VisualTreeHelper没有的父级的情况。“
http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.parent(v=VS.95).aspx