我對WPF比較陌生,有些東西對我來說很陌生。首先,與Windows窗體不同,WPF控件層次結構不支持IDisposable。在Windows窗體中,如果用戶控件使用任何託管資源,則通過覆蓋每個控件實現的Dispose方法來清理資源非常容易。正確清理WPF用戶控件
在WPF中,故事並不那麼簡單。我已經搜索了幾個小時,並且遇到了兩個基本主題:
第一個主題是Microsoft明確指出WPF沒有實現IDisposable,因爲WPF控件沒有非託管資源。雖然這可能是事實,但他們似乎完全錯過了WPF類層次結構的用戶擴展實際上可能使用託管資源(直接或間接通過模型)的事實。通過不實現IDisposable,Microsoft已經有效地移除了唯一可以保證自定義WPF控件或窗口使用的非託管資源得到清理的機制。
其次,我發現Dispatcher.ShutdownStarted幾個引用。我試圖使用ShutdownStarted事件,但它似乎並沒有爲每個控件觸發。我有一堆WPF UserControl,我已經爲ShutdownStarted實現了一個處理程序,並且它永遠不會被調用。我不確定它是否僅適用於Windows,或者WPF App類。然而,它並沒有正確啓動,每次關閉應用程序時我都會打開PerformanceCounter對象。
是否有比Dispatcher.ShutdownStarted事件清理非託管資源更好的選擇?是否有一些技巧來實現IDisposable,以便Dispose被調用?如果可能的話,我更希望避免使用終結器。
+1用於將一次性資源移出代碼隱藏。 WPF的關鍵學習點之一是最大限度地減少代碼隱藏,以充分利用數據綁定架構的優勢和表現力。學習是一件痛苦的事情(學習曲線更像攀登懸崖),但是當你「獲得」WPF思維模式時會有所收穫。 – 2009-10-11 13:22:09
所有可支配資源都在ViewModel中,它們本身是IDisposable。我真的很困惑爲什麼Dispatcher.ShutdownStarted事件不會觸發。性能計數器控件(及其關聯的ViewModel)確實附加到WPF圖形中,因爲它嵌入在的中。 –
jrista
2009-10-11 19:00:14
@Greg D:我通常會得到WPF模型。我一掌握了WPF的基礎知識,就開始使用MVVM,並且我的CodeBehind幾乎和它一樣純粹(僅僅是默認構造函數和對InitializeComponent的調用)。 WPF的可組合性和數據綁定功能非常出色,如果我有選擇,我永遠不會回到Windows窗體。 – jrista 2009-10-11 19:02:13