2009-02-09 15 views
5

我知道,當你註冊一個對象到鼠標的附加事件時,你有內存泄漏。這就是爲什麼你需要使用WeakEvent pattern內置的WPF控件如何管理其事件處理程序以附加事件?

我對這種模式有一個問題:如果你想使用它,你不能在XAML代碼中定義你的處理程序。

對我來說,這意味着這樣每個代碼泄漏:

<SomeControl Mouse.MouseDown="MyHandler" /> 

除非你明確地刪除您的處理程序代碼(我懷疑任何人都不會說)。 現在有件事我不明白:

<Button Click="MyHandler" /> 

此代碼以某種方式使用某處Mouse.MouseDown事件來檢測按鈕的點擊。我發現這個事件使用了UIElement類的MouseDown。當我讀取UIElement的代碼時,我不明白:沒有WeakEventManager!

能有人可以解釋我收到了如何的UIElement事件從Mouse.MouseDown不泄漏?

回答

7

在XAML中使用常規處理程序不需要弱引用。

你在做什麼是創建主控制和該控件中包含子控件之間的內存參考;在這種情況下,子控件是按鈕。

如果有人堅持到主控制的可視化樹的任何部分的引用,整棵樹會留在內存中,因爲它被連接在一起(父/子引用)。

現在,如果所有引用此樹被刪除,因爲這些控件是通過父/子引用已鏈接父母和子女(主要控制按鈕)之間的事件引用不是顯著。一旦所有的外部引用被刪除,這個控件就可以被垃圾收集。

XAML中的事件處理程序僅創建內部事件引用。

你有當外部客戶端註冊上的控件的事件要小心了,因爲你正在創建一個外部參考,將繼續控制活着,只要鏈接和客戶端存在(除非它是一個弱引用) 。

你的問題是關於附加事件。似乎沒有任何關於附加事件是否導致內存泄漏的明確文檔。在我看來,像訂閱該事件的UI控件包含對事件的引用而不是其他方式,但我認爲靜態事件對象必須具有某種方式通知控件它已被觸發。微軟對此似乎缺乏評論。

+0

我同意你的觀點,但在處理XAML到連接的事件(我不談論控件的事件,但事件Mouse.MouseDown)可能會泄漏,因爲總是有它的參考。 在內部,Button類使用Mouse.MouseDown事件(UIElement具體)。我不知道爲什麼這不會泄漏。 – 2009-02-09 21:34:13

相關問題