C#WPF如何正确关闭新窗口?

时间:2017-02-07 03:03:25

标签: c# wpf window

我有一个简单的问题:

  1. 创建一个新的WPF项目,其中有启动窗口(MainWindow.xaml)。
  2. 在此项目中,创建一个新窗口(Window1.xaml)
  3. Windows1加载的事件,让它关闭:

    private void Window_Loaded(object sender, RoutedEventArgs e) { this.Close(); }

  4. 向MainWindow添加一个“打开”按钮,实现它的点击事件:

    private void button_Click(object sender, RoutedEventArgs e) { Window1 w = new Window1(); w.Show(); }

  5. 当我启动这个应用程序时,VS2015的UI变为'调试模式',然后我点击窗口右上角的关闭按钮,VS2015的UI回到正常模式。

    现在,如果我启动应用程序,单击“打开”按钮,然后Window1将快速显示并关闭,但是,如果我单击MainWindow右上角的关闭按钮,事情就不同了:VS2015将不会恢复正常模式,但保持'调试模式'。所以对我来说,这意味着什么东西挂在那里,我不知道它是什么。

    有没有人知道如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

这不是答案,而只是我对实际有趣观察的发现。我做了几次测试(打开和关闭Window),然后转储了WPF窗口列表:

foreach (Window w in Application.Current.Windows)
    Debug.WriteLine(w.GetType().FullName)

导致:

WpfTest.MainWindow
Microsoft.VisualStudio.DesignTools.WpfTap.WpfVisualTreeService.Adorners.AdornerLayerWindow
Microsoft.VisualStudio.DesignTools.WpfTap.WpfVisualTreeService.Adorners.AdornerLayerWindow
Microsoft.VisualStudio.DesignTools.WpfTap.WpfVisualTreeService.Adorners.AdornerLayerWindow

WpfTap是Visual Studio的WPF调试器,可帮助调试WPF内容树。

现在,如果不是使用Loaded事件,而是使用ContentRendered事件来关闭窗口,它不会发生,并且事情正常。如果我在没有调试的情况下运行.exe也没关系。

因此,似乎Visual Studio在* Window Loaded事件之后附加了WPF调试器*,如果过早关闭窗口,它会使调试器组件在内存中停留。

答案 1 :(得分:3)

在App.xaml中设置:

ShutdownMode="OnMainWindowClose"

这必须解决问题。我建议阅读this question