8

我有一个简单的 WPF 单窗口应用程序,其中包含文本框和按钮。而且我还在WPF窗口中使用了Windows Forms的NotifyIcon和DateTimePicker。如何有效地处置所有控件?

4

4 回答 4

6

WPF 中几乎没有任何东西有Dispose方法。绝大多数类封装了纯托管信息。您可以将一个对象附加到树中(例如,通过一个Children.Add方法),然后您可以再次删除它——这就是状态管理的工作方式。它完全不适合该IDisposable模式,因为一旦您删除了一个控件,您就可以再次添加它,而Dispose意味着永远(尽管您可以使用/方法Dispose来管理它)。AddRemove

Microsoft 论坛上关于它的讨论。

有一些东西应该是IDisposable但不是,比如DispatcherTimer,并且没有什么可以阻止你IDisposable在自己的类上实现。何时打电话由您决定Dispose;基本上,当您知道您将不再使用该对象时。

对于Window您只需调用Close关闭它,WPF 会处理其他所有事情。

于 2009-08-07T06:38:45.193 回答
1

我想说,WPF 应用程序中的规则与任何其他 .NET 应用程序中的规则相同:如果一个对象实现了IDisposable,则应该Dispose在使用完毕后调用它。如果您动态加载和卸载控件,并且它们没有实现IDisposable,那么只需设置对null(并分离任何事件处理程序)的任何引用就足以让垃圾收集器完成其工作。

于 2009-08-07T06:16:06.333 回答
1

遵守CA1001:让拥有类型实现IDisposable

放弃所有控件都是IDisposable的旧 Windows 窗体事实。实施并打电话给Dispose自己。

sealed partial class MainWindow : IDisposable {
    readonly IDisposable disposable;
    public MainWindow() {
        disposable = ...
    }

    public void Dispose() {
        disposable.Dispose();
    }

    protected override void OnClosed(EventArgs e) {
        Dispose();
        base.OnClosed(e);
    }
}
于 2015-02-23T12:56:10.217 回答
0

如果该控件是某些 IContainer(这是 .NET 中的通用模型)的一部分,那么您的控件只需要实现 IDisposable。因此 Dispose() 将在适当的时候自动调用。

于 2009-08-07T06:34:05.453 回答