2012-05-14 38 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。 –