在WP7應用程序中,我遞歸地使用FrameworkElement.Parent來確定特定元素是否在另一個元素內。但它並不總是正確工作。 然後我改變我的代碼遞歸使用VisualtreeHelper.GetParent方法,它總是正常工作(就目前爲止我測試)。FrameworkElement.Parent和VisualtreeHelper.GetParent的行爲不同
那麼它們有什麼不同呢?
感謝
在WP7應用程序中,我遞歸地使用FrameworkElement.Parent來確定特定元素是否在另一個元素內。但它並不總是正確工作。 然後我改變我的代碼遞歸使用VisualtreeHelper.GetParent方法,它總是正常工作(就目前爲止我測試)。FrameworkElement.Parent和VisualtreeHelper.GetParent的行爲不同
那麼它們有什麼不同呢?
感謝
考慮ControlA
和ControlB
其中ControlA是一個內容控制意味着它可以包含其他控件。
<ControlA>
<ControlB />
</ControlA>
在這種情況下,ControlB實例的Parent屬性在邏輯上是ControlA的一個實例。
但是,如果您要查看ControlA的默認樣式的設置器,您可能會發現複雜的Xaml包含一些視覺狀態管理和邊界和柵格的層次結構,最後被埋在該批次中有一個ContentPresenter
,其中子控件將被放置。
遞歸循環VisualTreeHelper.Parent會找到從ContentPresenter
模板中定義的每個元素直到「邏輯」父元素,然後超出。
「通過Silverlight中FrameworkElement.Parent屬性報告的值通常是會用VisualTreeHelper API報告相同的值,因爲這兩個概念樹經常儘可能同步,如何親子會報告關係,但是,有些情況下,FrameworkElement.Parent會報告VisualTreeHelper沒有的父項。「
http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.parent(v=VS.95).aspx
我已閱讀文檔,但沒有解釋何時以及爲什麼他們的行爲不同。 – CuiPengFei
我明白了。 VisualTreeHelper.GetParent給出null,而FrameworkElement.Parent不爲null。這在WinRT上。 – bitdisaster
這意味着VisualTreeHelper.GetParent返回可視化樹父級和FrameworkElement.Parent返回邏輯樹父級? – CuiPengFei
@CuuPengFei:是的。 – AnthonyWJones