问题是WPF Window没有实现IDisposable接口,这让我相信,当我通过调用ShowDialog()打开它时我不必手动处理它,但是第一条评论on this MSDN page说明不同。有人知道真相是什么吗?
答案 0 :(得分:5)
仅当您使用Show()而不是ShowDialog()打开窗口时。
来自文档:
如果通过调用ShowDialog打开的窗口以及其IsCancel属性设置为true的Button将在单击按钮或按下ESC时自动关闭。但是,如果使用Show打开窗口,则必须显式调用Close,例如来自Button的Click事件处理程序。
和
关闭窗口会导致Closing事件被引发。如果未取消Closing事件,则会发生以下情况:
- 从Application.Windows中删除窗口(如果存在Application对象)。
- 如果在显示拥有的窗口之前和打开所有者窗口之后建立了所有者/所有者关系,则会从所有者窗口中删除窗口。
- 提出已结束的活动。
- 处理由窗口创建的非托管资源。
- 如果调用ShowDialog来显示Window,则显示ShowDialog。
答案 1 :(得分:0)
下面的代码怎么样?在表单上实现IDisposable并删除所有事件处理程序。 但是,Microsoft是否已在Close()?
上执行此操作还可以手动GC.Collect帮助吗?
一些参考文献和相关帖子:
What is the correct way to dispose of a WPF window?
What is the correct way to dispose of a WPF window?
/// <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();
}
}