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

Oh *_*Dog 4 c# wpf window

我有一个简单的问题:

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

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

  4. 在MainWindow上放置一个“打开”按钮,实现它的click事件:

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

当我启动该应用程序时,VS2015的UI变为“调试模式”,然后单击Window右上角的关闭按钮,VS2015的UI返回正常模式。

现在,如果我启动应用程序,请单击“打开”按钮,然后Window1将快速显示并关闭,但是,如果我单击MainWindow右上角的关闭按钮,则情况有所不同:VS2015将不会返回正常模式,而是保持不变在“调试模式”下。所以对我来说,那意味着有些东西挂在那里,我不知道那是什么。

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

NPr*_*ras 5

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

foreach (Window w in Application.Current.Windows)
    Debug.WriteLine(w.GetType().FullName)
Run Code Online (Sandbox Code Playgroud)

导致:

WpfTest.MainWindow
Microsoft.VisualStudio.DesignTools.WpfTap.WpfVisualTreeService.Adorners.AdornerLayerWindow
Microsoft.VisualStudio.DesignTools.WpfTap.WpfVisualTreeService.Adorners.AdornerLayerWindow
Microsoft.VisualStudio.DesignTools.WpfTap.WpfVisualTreeService.Adorners.AdornerLayerWindow
Run Code Online (Sandbox Code Playgroud)

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

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

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


Ron*_*Ron 4

在App.xaml集中:

ShutdownMode="OnMainWindowClose"
Run Code Online (Sandbox Code Playgroud)

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