FrameworkElement.Parent和VisualtreeHelper.GetParent的行为有所不同

时间:2011-08-03 05:05:46

标签: .net silverlight windows-phone-7 visualtreehelper frameworkelement

在WP7应用程序中,我以递归方式使用FrameworkElement.Parent来确定特定元素是否在另一个元素内。但它并不总是正常工作。 然后我改变了我的代码,以递归方式使用VisualtreeHelper.GetParent方法,并且它始终正常工作(就我测试而言)。

那么它们的区别是什么?

由于

2 个答案:

答案 0 :(得分:4)

考虑ControlAControlB,其中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