3

在WP7應用程序中,我遞歸地使用FrameworkElement.Parent來確定特定元素是否在另一個元素內。但它並不總是正確工作。 然後我改變我的代碼遞歸使用VisualtreeHelper.GetParent方法,它總是正常工作(就目前爲止我測試)。FrameworkElement.Parent和VisualtreeHelper.GetParent的行爲不同

那麼它們有什麼不同呢?

感謝

回答

4

考慮ControlAControlB其中ControlA是一個內容控制意味着它可以包含其他控件。

<ControlA> 
    <ControlB /> 
</ControlA> 

在這種情況下,ControlB實例的Parent屬性在邏輯上是ControlA的一個實例。

但是,如果您要查看ControlA的默認樣式的設置器,您可能會發現複雜的Xaml包含一些視覺狀態管理和邊界和柵格的層次結構,最後被埋在該批次中有一個ContentPresenter,其中子控件將被放置。

遞歸循環VisualTreeHelper.Parent會找到從ContentPresenter模板中定義的每個元素直到「邏輯」父元素,然後超出。

+0

這意味着VisualTreeHelper.GetParent返回可視化樹父級和FrameworkElement.Parent返回邏輯樹父級? – CuiPengFei

+0

@CuuPengFei:是的。 – AnthonyWJones

1

「通過Silverlight中FrameworkElement.Parent屬性報告的值通常是會用VisualTreeHelper API報告相同的值,因爲這兩個概念樹經常儘可能同步,如何親子會報告關係,但是,有些情況下,FrameworkElement.Parent會報告VisualTreeHelper沒有的父項。「

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.parent(v=VS.95).aspx

+0

我已閱讀文檔,但沒有解釋何時以及爲什麼他們的行爲不同。 – CuiPengFei

+0

我明白了。 VisualTreeHelper.GetParent給出null,而FrameworkElement.Parent不爲null。這在WinRT上。 – bitdisaster