WPF控件WindowsFormsHost继承自IDisposable。

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

最佳答案

如果应用程序关闭,则无需采取任何措施即可正确处置WindowsFormsHost。由于它派生自HwndHost,因此在Dispatcher关闭时将处理处置。如果使用Reflector,则会看到在初始化HwndHost时会创建一个WeakEventDispatcherShutdown。

如果在对话框中使用它,则我最好的建议是重写OnClosed并处置主机,否则HwndHost会一直徘徊,直到分派(dispatch)器关闭为止。

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);
    }
}

09-07 09:34