it-roy-ru.com

Как программно выйти из приложения WPF?

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

Я пытался:

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

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

429
anon271334

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

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

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

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

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

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

699
Dirk Vollmar

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

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

Environment.Exit(0)
141
John

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

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

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

57
Allen Pestaluky

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

1.

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

2.

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

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

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

   Environment.Exit(0);
32
Kylo Ren

Это должно сделать трюк:

Application.Current.Shutdown();

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

Подробности в приложении. Текущий

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

24
Brian MacKay

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

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

Application.Current.Shutdown();
16
TimothyP

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

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

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

16
B.K.

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

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

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

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

6
Ali Yousefi

Насколько я понимаю, Application.Current.Shutdown() также имеет свой недостаток.

Если вы хотите показать окно подтверждения, чтобы позволить пользователям подтвердить выход или нет, функция Application.Current.Shutdown() необратима.

6
wuminqi

Пытаться

App.Current.Shutdown();

Для меня

Application.Current.Shutdown(); 

не работал.

6
Iwona Kubowicz
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);
}
5
Ravi

Caliburn микро ароматизированный

public class CloseAppResult : CancelResult
{
    public override void Execute(CoroutineExecutionContext context)
    {
        Application.Current.Shutdown();
        base.Execute(context);
    }
}

public class CancelResult : Result
{
    public override void Execute(CoroutineExecutionContext context)
    {
        OnCompleted(this, new ResultCompletionEventArgs { WasCancelled = true });
    }
}
2
Anders