Как программно выйти из приложения WPF? - PullRequest
432 голосов
/ 12 мая 2010

За те несколько лет, что я использовал C # (Windows Forms), я никогда не использовал WPF. Но теперь я люблю WPF, но не знаю, как мне выйти из приложения, когда пользователь нажимает на пункт «Выход» в меню «Файл».

Я пробовал:

this.Dispose();
this.Exit();
Application.ShutDown();
Application.Exit();
Application.Dispose();

Среди многих других. Ничего не работает.

Ответы [ 14 ]

704 голосов
/ 12 мая 2010

Для выхода из приложения вы можете позвонить

System.Windows.Application.Current.Shutdown();

Как описано в документации к методу Application.Shutdown, вы также можете изменить поведение завершения работы приложения, указав ShutdownMode :

Выключение неявно вызывается Windows Presentation Foundation (WPF) в следующих ситуациях:

  • Когда для ShutdownMode установлено значение OnLastWindowClose.
  • Когда для ShutdownMode установлено значение OnMainWindowClose.
  • Когда пользователь завершает сеанс и событие SessionEnding либо не обрабатывается, либо обрабатывается без отмены.

Также обратите внимание, что Application.Current.Shutdown(); может вызываться только из потока, который создал объект Application, то есть обычно из основного потока.

142 голосов
/ 29 января 2012

Если вам действительно нужно это закрыть, вы также можете использовать Environment.Exit () , но это совсем не изящно (больше похоже на завершение процесса).

Используйте его следующим образом:

Environment.Exit(0)
58 голосов
/ 29 января 2012

Как сказал wuminqi , Application.Current.Shutdown(); необратимо, и я считаю, что обычно оно используется для принудительного закрытия приложения в такие моменты, как когда пользователь выходит из системы или закрывает Windows.

Вместо этого позвоните this.close() в главном окне. Это то же самое, что нажать Alt + F4 или кнопку закрытия [x] в окне. Это приведет к закрытию всех других принадлежащих ему окон и вызовет Application.Current.Shutdown();, пока действие закрытия не было отменено. Пожалуйста, смотрите документацию MSDN по Закрытие окна .

Кроме того, поскольку this.close() можно отменить, вы можете поместить его в диалог подтверждения сохранения изменений в обработчике закрывающих событий. Просто создайте обработчик события для <Window Closing="..."> и измените e.Cancel соответственно. (Подробнее о том, как это сделать, см. Документацию MSDN .)

32 голосов
/ 22 января 2016

При необходимости используйте любое из следующего:

1.

 App.Current.Shutdown();
OR
 Application.Current.Shutdown();

2.

 App.Current.MainWindow.Close();
OR
 Application.Current.MainWindow.Close();

Выше всех методов будет вызываться closing event класса Window, и выполнение может прекратиться в какой-то момент (обычно приложения помещают диалоги, такие как Вы уверены? ' или' Хотите сохранить данные перед закрытием? ', до полного закрытия окна)

3. Но если вы хотите прекратить работу приложения без предупреждения немедленно. Используйте ниже

   Environment.Exit(0);
24 голосов
/ 12 мая 2010

Это должно сработать:

Application.Current.Shutdown();

Если вам интересно, вот некоторые дополнительные материалы, которые я нашел полезными:

Информация о приложении. Текущий

Жизненный цикл приложения WPF

18 голосов
/ 08 февраля 2014

Вот как я делаю мои:

// Any control that causes the Window.Closing even to trigger.
private void MenuItemExit_Click(object sender, RoutedEventArgs e)
{
    this.Close();
}

// Method to handle the Window.Closing event.
private void Window_Closing(object sender, CancelEventArgs e)
{
    var response = MessageBox.Show("Do you really want to exit?", "Exiting...",
                                   MessageBoxButton.YesNo, MessageBoxImage.Exclamation);
    if (response == MessageBoxResult.No)
    {
        e.Cancel = true;
    }
    else
    {
        Application.Current.Shutdown();
    }
}

Я вызываю Application.Current.ShutDown() только из главного окна приложения, все остальные окна используют this.Close(). В моем главном окне Window_Closing(...) обрабатывает верхнюю правую кнопку x. Если какой-либо из методов вызывает закрытие окна, Window_Closing(...) захватывает событие для выключения, если пользователь подтверждает.

Причина, по которой я действительно использую Application.Current.Shutdown() в моем главном окне, заключается в том, что я заметил, что если была допущена ошибка проектирования, и я не объявил родителя одного из моих окон в приложении, если это окно открывается без отображения до закрытия последнего активного окна, у меня остается скрытое окно, работающее в фоновом режиме. Приложение не будет закрыто. Единственный способ предотвратить полную утечку памяти - это зайти в Task Manager , чтобы закрыть приложение. Application.Current.Shutdown() защищает меня от непреднамеренных недостатков дизайна.

Это из моего личного опыта. В конце концов, используйте то, что лучше для вашего сценария. Это просто еще одна информация.

16 голосов
/ 12 мая 2010

Не должно быть сообщений Application.ShutDown(); или .Exit().

Application - статический класс. Это не относится к текущему приложению. Вам нужно перейти к текущему приложению, а затем закрыть его следующим образом:

Application.Current.Shutdown();
6 голосов
/ 04 декабря 2017

Еще один способ сделать это:

System.Diagnostics.Process.GetCurrentProcess().Kill();

Это заставит убить ваше приложение. Это всегда работает, даже в многопоточном приложении.

Примечание. Просто будьте осторожны, чтобы не потерять несохраненные данные в другом потоке.

6 голосов
/ 25 марта 2015

Попробуйте

App.Current.Shutdown();

Для меня

Application.Current.Shutdown(); 

не работает.

6 голосов
/ 25 февраля 2014
private void _MenuExit_Click(object sender, RoutedEventArgs e)
{
   System.Windows.Application.Current.MainWindow.Close();
}

//Override the onClose method in the Application Main window

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    MessageBoxResult result =   MessageBox.Show("Do you really want to close", "",
                                          MessageBoxButton.OKCancel);
    if (result == MessageBoxResult.Cancel)
    {
       e.Cancel = true;
    }
    base.OnClosing(e);
}
...