WPF控件WindowsFormsHost继承自IDisposable。

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

有帮助吗?

解决方案 2

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

(显然你可以避免继承IDisposable吗,但有时候你不能)

当层次结构中的第一个父窗口关闭时,将调用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();
                    };
                }
            };

            ...

        }

        ...
    }

其他提示

在应用程序关闭的情况下,您无需执行任何操作即可正确处理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);
    }
}

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top