2009-11-11 48 views
2

有一個屬性「AffectsParentArrange」會隱式地無效父級的佈局 - 但我想將事件處理程序附加到由該屬性觸發的「事件」。如何在您不是父母時監聽AffectsParentArrange事件

當屬性發生變化時,父母的安排將失效。

我有一個需要接收事件的自定義控件(它不是直接父對象)。

有沒有人知道可以在這裏使用的事件?

我是否需要提供覆蓋方法並觸發事件的自定義父級?

回答

1

當屬性發生變化時,它僅對母公司調用InvalidateArrange()。這會導致WPF稍後在父級上調用Arrange()。這些調用都沒有任何方法來攔截它(不使用真的偷偷摸摸的技術,例如修補IL代碼或將調試器附加到進程中)。

這意味着,寫託管代碼能夠檢測InvalidateArrange()的唯一方法是創建覆蓋ArrangeOverride方法定製父母,或挖掘到所討論的特定的控制的Arrange方法的一些行爲 - 例如,如果父母是Panel,您可以添加一個額外的不可見孩子,以便從其父母接收Arrange()調用。

更新當你得到你所不能檢測出排列()回調爲什麼InvalidateArrange()被調用父,但你可以檢測通過保存的舊值與AffectsParentArrange標誌的屬性是否有變化每Arrange呼叫中的財產並將其與先前保存的值進行比較。這可以通過使用循環,詞典以及屬性列表或致電GetLocalValueEnumerator()擴展到多個屬性。

+0

問題在於ArrangeOverride無法區分自上而下和自下而上。每當從任何來源無效的安排發送一個事件。不幸的是,我的事件處理程序的一個副作用是導致控件重新排列。 – 2009-11-13 14:53:09

+0

沒問題。我已經將解決​​方案添加到了我的答案中。 – 2009-11-13 17:03:41