我有一个简单的WPF单窗口应用程序包含Textboxes和Buttons。我还在WPF窗口中使用Windows窗体的NotifyIcon和DateTimePicker。我怎样才能有效地处理所有控件?
答案 0 :(得分:5)
WPF中的任何内容都没有Dispose
方法。绝大多数类都封装了纯粹的托管信息。您可以将对象附加到树中(例如,通过Children.Add
方法),然后您可以再次将其删除 - 这就是状态管理的工作方式。它完全不适合IDisposable
模式,因为一旦删除了控件,就可以再次添加它,而Dispose
意味着永远(尽管您可以使用Dispose
来管理它除了Add
/ Remove
方法之外。
A discussion about it on the Microsoft forums.
有些事情应该是IDisposable
但不是DispatcherTimer
,并且没有什么可以阻止你在自己的课程上实施IDisposable
。您可以在何时致电Dispose
;基本上当你知道你不再使用这个对象时。
对于Window
,您只需致电Close
即可将其关闭,而WPF会处理其他所有内容。
答案 1 :(得分:1)
我想说同样的规则适用于WPF应用程序,就像在任何其他.NET应用程序中一样:如果一个对象实现了IDisposable
,那么在使用它时应该调用Dispose
。如果您动态加载和卸载控件,并且它们没有实现IDisposable
,那么设置对null
的任何引用(以及分离任何事件处理程序)应该足以让垃圾收集器完成它的工作。
答案 2 :(得分: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);
}
}
答案 3 :(得分:0)
如果该控件是某些IContainer(这是.NET中的常见模型)的一部分,那么控件只需要实现IDisposable。因此,Dispose()将在适当的时间自动调用。