简体   繁体   中英

C# WPF How to close a new window correctly?

I have a simple question:

1- Create a new WPF project, there's startup window in it: MainWindow.xaml .

2- In this project, create a new window Window1.xaml .

3- Windows1 's loaded event, let it close.

4- Put an Open button to MainWindow . Implement it's click event.

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

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

When I start this application, VS2015's UI became to the DEBUGING MODE , then I click the close button on the right top corner of the Window, VS2015's UI back to normal mode.

Now, if I start application, click Open button, then Window1 will show quickly and closed, but, if I click the close button on the right top corner of MainWindow , things different: VS2015 will no go back to normal mode but stay in DEBUGING MODE . so to me, that means something hang there and I don't know what is it.

Is there anyone know how to fix this problem?

This is not an answer, but just my findings of an actually interesting observation. I did your test (opening and closing the Window) a couple times and then dumped the list of WPF windows:

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

Resulting in:

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

WpfTap is Visual Studio's WPF debugger, that helps debug the WPF content tree.

Now, if instead of using the Loaded event, I used the ContentRendered event to close the window, it doesn't happen, and things work as normal. It's also fine if I run the.exe without debugging.

So it seems like Visual Studio attaches the WPF debugger *after* a Window's Loaded event, and if you close the window too early, it leaves the debugger component hanging around in memory.

In the App.xaml set:

ShutdownMode="OnMainWindowClose"

This must solve the problem. I recommend reading this question .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM