2012-05-14 35 views
-2

所以,我從來沒有做過一個可觀的WPF項目,但現在,這個有我想;怎麼了WPF類沒有實施IDisposable?相比之下,Windows窗體中的所有UI元素都實現了IDisposable,以確保它們擺脫底層手柄等。爲什麼WPF不使用IDisposable,分支是什麼?

我認爲那裏有相同的Windows對象,並且這些資源必須被釋放;那麼,WPF如何做到這一點?

有什麼我需要做我的WPF窗口對象超越Close()他們?

+4

關聯:http://stackoverflow.com/questions/254271/when-can-i-dispose-an-idisposable-wpf-control-e-g-windowsformshost –

+0

@DavidBrabant這裏也有一些很好的信息。 –

回答

17

WinForms控件具有句柄,因爲它們是Win32控件的包裝。 WPF控件不是(好吧,窗戶,但他們託管的控件不是)。原因在於,畢竟,WPF窗口只是一個Direct3D渲染上下文,而所有的控件都只是一堆三角形。因此,他們不需要實際註冊到操作系統,因此,他們沒有句柄(除了窗口和任何從HwndHost繼承,當然,其中 Win32對象)。

這就是爲什麼WPF和WinForms之間存在如此大的互操作層:WPF控件根本不是Windows對象。

+0

我不熟悉WPF,但我期望另一個重要方面是WPF使用弱事件處理程序。在某些方面,我認爲更重要的是,因爲拋棄了持有對Win32控件引用的對象,可以使用終結器來通知Windows不再需要這些控件,但是放棄訂閱者從長壽出版商那裏獲得的「強大」事件將不會是在這些活動出版商的一生中收集。 – supercat

+0

屏幕上的所有WPF元素最終都由HWND支持。在創建WPF窗口時,WPF會創建頂級HWND,並使用HwndSource將Window及其WPF內容放入HWND中。應用程序中剩餘的WPF內容共享單數HWND。 –