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

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

Я пробовал:

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

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

15 ответов


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

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

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

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

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

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


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

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

Environment.Exit(0)

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

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

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


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

1.

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

2.

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

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

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

   Environment.Exit(0);

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

Application.Current.Shutdown();

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

подробнее о применении.Ток

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


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

// 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(...) обрабатывает верхний правый . Если какой-либо из методов вызывает window closer,Window_Closing(...) хватает событий для выключения, если пользователь подтверждает.

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

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


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

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

Application.Current.Shutdown();

попробовать

App.Current.Shutdown();

для меня

Application.Current.Shutdown(); 

не работает.


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);
}

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

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


другой способ сделать это:

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

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

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


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 });
    }
}

из кода xaml можно вызвать предопределенную SystemCommand:

Command="SystemCommands.MinimizeWindowCommand"

Я думаю, что это должен быть предпочтительный способ...


мы можем использовать this.Close() метод MainWindow.xaml.cs файл, чтобы закрыть окно.

или использовать App.Current.Shutdown() метод MainWindow.xaml.cs файл, чтобы закрыть окно.


очень удобно. Используйте код ниже:

Application.Current.Shutdown();