Как программно выйти из приложения WPF?
В течение нескольких лет я использовал C# (Windows Forms), я никогда не использовал WPF. Но теперь я люблю WPF, но я не знаю, как мне выйти из приложения, когда пользователь нажимает на пункт "Выход" из меню "Файл".
Я пытался:
this.Dispose();
this.Exit();
Application.ShutDown();
Application.Exit();
Application.Dispose();
Среди многих других. Ничего не работает
21 ответ
Для выхода из приложения вы можете позвонить
System.Windows.Application.Current.Shutdown();
Как описано в документации к Application.Shutdown
Метод, который вы также можете изменить поведение при закрытии вашего приложения, указав ShutdownMode:
Windows Presentation Foundation (WPF) неявно вызывается в следующих ситуациях:
- Когда ShutdownMode имеет значение OnLastWindowClose.
- Когда ShutdownMode установлен в OnMainWindowClose.
- Когда пользователь завершает сеанс и событие SessionEnding либо не обрабатывается, либо обрабатывается без отмены.
Пожалуйста, обратите внимание, что Application.Current.Shutdown();
может быть вызван только из потока, который создал Application
объект, т.е. обычно основной поток.
Если вам действительно нужно закрыть его, вы также можете использовать Environment.Exit (), но это совсем не изящно (больше похоже на завершение процесса).
Используйте это следующим образом:
Environment.Exit(0)
Как сказал Вуминци, Application.Current.Shutdown();
является необратимым, и я считаю, что обычно он используется для принудительного закрытия приложения в такие моменты, как когда пользователь выходит из системы или закрывает Windows.
Вместо этого позвоните this.close()
в вашем главном окне. Это то же самое, что нажатие Alt + F4 или кнопка закрытия [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
изWindow
класс и выполнение могут остановиться в какой-то момент (потому что обычно приложения помещают диалоги типа"Вы уверены?" или " Вы хотите сохранить данные перед закрытием? ", до полногозакрытия окна)
3. Но если вы хотите прекратить работу приложения без предупреждения немедленно. Используйте ниже
Environment.Exit(0);
Это должно сделать трюк:
Application.Current.Shutdown();
Если вам интересно, вот некоторые дополнительные материалы, которые я нашел полезными:
Подводя итог, есть несколько способов сделать это.
1) Убивающий процесс, пропускающий финализацию, обработку ошибок и т.д.:
Process.GetCurrentProcess().Kill();
2) Завершение работы текущего приложения, что, вероятно, является правильным способом, поскольку оно вызывает события выхода:
Application.Current.Shutdown();
или
this.Shutdown();
(когда clled в экземпляре App-класса)
3) Закрытие текущего приложения (все формы должны быть закрыты / завершены раньше):
this.Close();
(когда clled в экземпляре App-класса)
4) Выход из среды, завершающий работу приложения:
Environment.Exit(0);
Кроме того, Вы можете прочитать о выходе statusses здесь
Вот как я делаю мои:
// 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()
защищает меня от непреднамеренных недостатков дизайна.
Это из моего личного опыта. В конце концов, используйте то, что лучше для вашего сценария. Это просто еще одна часть информации.
Там не должно быть Application.ShutDown();
или же .Exit()
сообщение.
Application
это статический класс. Это не относится к текущему приложению. Вам нужно перейти к текущему приложению и затем закрыть его так:
Application.Current.Shutdown();
Еще один способ сделать это:
System.Diagnostics.Process.GetCurrentProcess().Kill();
Это заставит убивать ваше приложение, потому что процесс всегда работает в многопоточном приложении.
Примечание. Просто позаботьтесь о приложении, в котором данные сохраняются в файлах из другого потока.
Пытаться
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()
необратим.
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 });
}
}
Если вы хотите выйти из другого потока, который не создавал объект приложения, используйте:
System.Windows.Application.Current.Dispatcher.InvokeShutdown();
Если вы используете
Application.Current.Shutdown()
для выхода из приложения вы можете получить
System.InvalidOperationException: 'The calling thread cannot access this object because a different thread owns it.
если вы вызываете его из другого потока. Чтобы решить эту проблему, вы можете обернуть вызов следующим образом
Application.Current.Dispatcher.Invoke(() => Application.Current.Shutdown());
if (System.Windows.Forms.Application.MessageLoop)
{
// WinForms app
System.Windows.Forms.Application.Exit();
system.Environment.Exit(1);
}
Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
Из кода xaml вы можете вызвать предопределенную SystemCommand:
Command="SystemCommands.MinimizeWindowCommand"
Я думаю, что это должно быть предпочтительным способом...
Мы можем использовать this.Close()
метод в MainWindow.xaml.cs
файл, чтобы закрыть окно.
Или используйте App.Current.Shutdown()
метод в MainWindow.xaml.cs
файл, чтобы закрыть окно.
Очень просто. Используйте код ниже:
Application.Current.Shutdown();