问题是 WPF Window 没有实现 IDisposable 接口,这让我相信,当我通过调用 ShowDialog() 打开它时,我不必手动处理它,但是这个 MSDN 页面上的第一条评论状态不同。有谁知道真相是什么?
问问题
5320 次
2 回答
6
仅当您使用 Show() 而不是 ShowDialog() 打开窗口时。
从文档中:
如果一个窗口通过调用 ShowDialog 打开,并且其 IsCancel 属性设置为 true 的 Button,将在单击该按钮或按下 ESC 时自动关闭。但是,如果窗口是使用 Show 打开的,则必须显式调用 Close,例如从 Button 的 Click 事件处理程序中调用。
和:
关闭窗口会引发 Closing 事件。如果未取消 Closing 事件,则会发生以下情况:
- Window 将从 Application.Windows 中删除(如果存在 Application 对象)。
- 如果在显示拥有的窗口之前和打开所有者窗口之后建立了所有者/拥有关系,则从所有者窗口中删除窗口。
- 引发 Closed 事件。
- 释放由 Window 创建的非托管资源。
- 如果调用 ShowDialog 来显示窗口,则 ShowDialog 返回。
于 2010-02-12T12:36:31.767 回答
0
下面的代码呢?在表单上实现 IDisposable 并删除所有事件处理程序。但是,微软是否已经在 Close() 上这样做了?
手动 GC.Collect 也有帮助吗?
一些参考资料和相关帖子:
/// <summary>
/// Interaction logic for MyForm.xaml
/// </summary>
public partial class MyForm: IDisposable
{
public MyForm()
{}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Dispose();
}
public void Dispose()
{
try{
_resourcescollection.Clear();
_resourcescoll = null;
//close other resources
}
catch(exception ex)
{}
EventHelper.RemoveAllEventHandlers(_resources);
EventHelper.RemoveAllEventHandlers(_timer);
EventHelper.RemoveAllEventHandlers(_etc);
EventHelper.RemoveAllEventHandlers(this);
}
~MyForm()
{
Dispose();
}
}
于 2013-08-02T05:53:33.297 回答