【问题标题】:Why does WPF not use IDisposable, and what are the ramifications?为什么 WPF 不使用 IDisposable,其后果是什么?
【发布时间】:2014-11-13 12:11:34
【问题描述】:

所以,我以前从未做过大型 WPF 项目,但这个让我想知道; WPF 类没有实现IDisposable 是怎么回事?相比之下,Windows 窗体中的所有 UI 元素都实现了IDisposable,以确保它们摆脱底层句柄等。

我认为相同的 Windows 对象在那里隐藏,这些资源必须被释放;那么,WPF 是如何做到的呢?

除了Close()ing 之外,我还需要对 WPF Window 对象做些什么吗?

【问题讨论】:

标签: .net wpf idisposable


【解决方案1】:

WinForms 控件具有句柄,因为它们是 Win32 控件的包装器。 WPF 控件不是(好吧,窗口是,但它们托管的控件不是)。原因在于,WPF 窗口毕竟只是一个 Direct3D 渲染上下文,所有控件都只是一堆三角形。因此,它们不需要实际注册到操作系统,因此,它们没有句柄(除了 windows 和继承自 HwndHost 的任何东西,当然,它们 Win32 对象)。

这就是 WPF 和 WinForms 之间存在如此大的互操作层的原因:WPF 控件根本不是 Windows 对象。

【讨论】:

  • 我不熟悉 WPF,但我希望另一个重要方面是 WPF 使用弱事件处理程序。在某些方面,我认为这一点更重要,因为持有对 Win32 控件的引用的废弃对象可以使用终结器来通知 Windows 不再需要这些控件,但是来自长期发布者的“强”事件的废弃订阅者不会在这些事件发布者的生命周期内收集。
  • 屏幕上的所有 WPF 元素最终都由 HWND 支持。创建 WPF Window 时,WPF 会创建一个顶级 HWND,并使用 HwndSource 将 Window 及其 WPF 内容放入 HWND。应用程序中的其余 WPF 内容共享单个 HWND。
猜你喜欢
  • 1970-01-01
  • 2017-11-26
  • 2016-02-13
  • 2020-11-09
  • 1970-01-01
  • 2012-07-04
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多