2017-02-07 9 views
2

У меня есть простой вопрос:C# WPF Как правильно закрыть новое окно?

  1. Создать новый проект WPF, есть окно запуска в нем (MainWindow.xaml).
  2. в этом проекте, создать новое окно (Window1.xaml) нагруженный событие
  3. Windows1, давайте это близко:

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

  4. поставить кнопку "Открыть" в главном окне, осуществить это нажмите событие:

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

Whe n Я запускаю это приложение, пользовательский интерфейс VS2015 превратился в «DEBUGING MODE», затем я нажимаю кнопку закрытия в правом верхнем углу окна, пользовательский интерфейс VS2015 возвращается в нормальный режим.

Теперь, если я запустил приложение, нажмите кнопку «Открыть», затем окно1 будет быстро и закрыто, но если я нажму кнопку закрытия в правом верхнем углу MainWindow, все будет по-другому: VS2015 не вернется к нормальный режим, но оставайтесь в режиме DEBUGING MODE. так что для меня это означает, что там что-то висит, и я не знаю, что это.

есть ли кто-нибудь знает, как исправить эту проблему?

ответ

2

В App.xaml установлено:

ShutdownMode="OnMainWindowClose" 

Это должно решить проблему. Рекомендую прочитать this question.

+0

это отлично работает! Спасибо чувак! даже лучше, чем ссылка, на которую вы ссылались. –

+0

Я рад, что смогу помочь. О ссылке: я имел в виду эту часть этого сообщения, объясняющую причину такого поведения: в вашем случае приложение не закрывается, потому что вы, вероятно, используете OnLastWindowClose по умолчанию. Если вы установите ShutdownMode на OnLastWindowClose: Windows Presentation Foundation (WPF) неявно вызывает Shutdown, когда последнее окно в приложении закрывается, даже если в настоящее время в качестве главного окна задано какое-либо текущее оконное окно (см. MainWindow). Поскольку вы открываете новое окно и не закрываете его, выключение не вызывается. – Ron

3

Это не ответ, а только мои находки на самом деле интересное наблюдение. Я сделал свой тест (открытие и закрытие окна) разы в пару, а затем сбрасывал список 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 является WPF отладчика Visual Studio,, ​​который помогает отлаживать дерево содержимого WPF.

Теперь, если вместо использования события Loaded я использовал событие ContentRendered, чтобы закрыть окно, этого не происходит, и все работает нормально. Это также нормально, если я запускаю .exe без отладки.

Так что, похоже, Visual Studio присоединяет отладчик WPF * после * события Window Loaded, и если вы закрываете окно слишком рано, это оставляет компонент отладчика висящим в памяти.

+0

Я пробовал ваш «Это тоже нормально, если я запустил.exe без отладки ", это правда. Теперь я полностью понимаю, почему это произошло. это точно ответ на мою проблему, просто пусть все это знают, спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^