所以,我從來沒有做過一個可觀的WPF項目,但現在,這個有我想;怎麼了WPF類沒有實施IDisposable
?相比之下,Windows窗體中的所有UI元素都實現了IDisposable
,以確保它們擺脫底層手柄等。爲什麼WPF不使用IDisposable,分支是什麼?
我認爲那裏有相同的Windows對象,並且這些資源必須被釋放;那麼,WPF如何做到這一點?
有什麼我需要做我的WPF窗口對象超越Close()
他們?
所以,我從來沒有做過一個可觀的WPF項目,但現在,這個有我想;怎麼了WPF類沒有實施IDisposable
?相比之下,Windows窗體中的所有UI元素都實現了IDisposable
,以確保它們擺脫底層手柄等。爲什麼WPF不使用IDisposable,分支是什麼?
我認爲那裏有相同的Windows對象,並且這些資源必須被釋放;那麼,WPF如何做到這一點?
有什麼我需要做我的WPF窗口對象超越Close()
他們?
WinForms控件具有句柄,因爲它們是Win32控件的包裝。 WPF控件不是(好吧,窗戶,但他們託管的控件不是)。原因在於,畢竟,WPF窗口只是一個Direct3D渲染上下文,而所有的控件都只是一堆三角形。因此,他們不需要實際註冊到操作系統,因此,他們沒有句柄(除了窗口和任何從HwndHost
繼承,當然,其中是 Win32對象)。
這就是爲什麼WPF和WinForms之間存在如此大的互操作層:WPF控件根本不是Windows對象。
我不熟悉WPF,但我期望另一個重要方面是WPF使用弱事件處理程序。在某些方面,我認爲更重要的是,因爲拋棄了持有對Win32控件引用的對象,可以使用終結器來通知Windows不再需要這些控件,但是放棄訂閱者從長壽出版商那裏獲得的「強大」事件將不會是在這些活動出版商的一生中收集。 – supercat
屏幕上的所有WPF元素最終都由HWND支持。在創建WPF窗口時,WPF會創建頂級HWND,並使用HwndSource將Window及其WPF內容放入HWND中。應用程序中剩餘的WPF內容共享單數HWND。 –
關聯:http://stackoverflow.com/questions/254271/when-can-i-dispose-an-idisposable-wpf-control-e-g-windowsformshost –
@DavidBrabant這裏也有一些很好的信息。 –