WPF:我应该在ShowDialog方法打开的窗口上手动调用Close吗?

时间:2010-02-12 12:33:21

标签: wpf window dispose showdialog

问题是WPF Window没有实现IDisposable接口,这让我相信,当我通过调用ShowDialog()打开它时我不必手动处理它,但是第一条评论on this MSDN page说明不同。有人知道真相是什么吗?

2 个答案:

答案 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();
      }

    }