5

问题是 WPF Window 没有实现 IDisposable 接口,这让我相信,当我通过调用 ShowDialog() 打开它时,我不必手动处理它,但是这个 MSDN 页面上的第一条评论状态不同。有谁知道真相是什么?

4

2 回答 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 也有帮助吗?

一些参考资料和相关帖子:

处理 WPF 窗口的正确方法是什么?

处理 WPF 窗口的正确方法是什么?

    /// <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 回答