我什么时候可以处理IDisposable WPF控件,例如WindowsFormsHost?

WPF控件WindowsFormsHostinheritance自IDisposable。

如果我有一个包含上述某些控件的复杂WPF可视树,我可以使用哪些事件或方法在关机期间调用IDispose?

在应用程序关闭的情况下,您无需执行任何操作来正确处理WindowsFormsHost。 由于它派生自HwndHost,因此在Dispatcher关闭时会处理。 如果使用Reflector,您将看到在初始化HwndHost时它会创建一个WeakEventDispatcherShutdown。

如果你在对话框中使用它,我建议的最好是覆盖OnClosed然后处理你的主机,否则HwndHost会一直闲置直到Dispatcher关闭。

public partial class Dialog : Window { public Dialog() { InitializeComponent(); } protected override void OnClosed(EventArgs e) { if (host != null) host.Dispose(); base.OnClosed(e); } } 

测试dispose何时被调用的一种简单方法是从WindowsFormsHost派生自定义类并在不同情况下进行游戏。 在处理中设置一个断点并查看它何时被调用。

 public class CustomWindowsFormsHost : WindowsFormsHost { protected override void Dispose(bool disposing) { base.Dispose(disposing); } } 

根据Todd的回答,我想出了一个由Window托管的任何WPF控件的通用解决方案,并希望在窗口关闭时保证处理。

(显然如果你可以避免inheritanceIDisposable那么做,但有时候你就是不能)

关闭层次结构中的第一个父窗口时调用Dispose。

(可能的改进 – 更改事件处理以使用弱模式)

 public partial class MyCustomControl : IDisposable { public MyCustomControl() { InitializeComponent(); Loaded += delegate(object sender, RoutedEventArgs e) { System.Windows.Window parent_window = Window.GetWindow(this); if (parent_window != null) { parent_window.Closed += delegate(object sender2, EventArgs e2) { Dispose(); }; } }; ... } ... } 

WPF控件不实现IDisposable接口,因为它们没有任何可处置的内容 (没有要清理的句柄,没有要释放的非托管内存)。 您需要做的就是确保您没有对控件的任何引用,GC将清除它们。

因此,WPF使用弱事件模式来确保控件可以被垃圾收集。 这是您需要实现的模式,以确保清理,而不是IDisposable。

关闭表单时不需要处理控件,如果控件位于表单的可视树中(作为表单的子表单或表单中的其他控件),API将自动为您执行操作