要退出您的应用程序,您可以调用
System.Windows.Application.Current.Shutdown();
如 Application.Shutdown
方法的文档中所述,您还可以通过指定 ShutdownMode 来修改应用程序的关闭行为:
在以下情况下,Windows Presentation Foundation (WPF) 会隐式调用 Shutdown: 当 ShutdownMode 设置为 OnLastWindowClose 时。当 ShutdownMode 设置为 OnMainWindowClose 时。当用户结束会话并且 SessionEnding 事件未处理或未取消处理时。
另请注意,Application.Current.Shutdown();
只能从创建 Application
对象的线程调用,即通常是主线程。
如果您真的需要它来关闭,您也可以使用 Environment.Exit(),但它一点也不优雅(更像是结束进程)。
按如下方式使用它:
Environment.Exit(0)
Environment.Exit()
至少需要一个参数,即退出代码。如果您不关心退出代码,请使用 Environment.Exit(0)
。
Application.Current.Shutdown();
Application.Current.Shutdown();
调用了我的 Closing
事件。所以 Environment.Exit(0);
是更好的选择。
由于 wuminqi said,Application.Current.Shutdown();
是不可逆的,我相信它通常用于强制应用程序在某些时候关闭,例如在用户注销或关闭 Windows 时。
相反,请在主窗口中调用 this.close()
。这与按 Alt + F4 或窗口上的关闭 [x] 按钮相同。这将导致所有其他拥有的窗口关闭并最终调用 Application.Current.Shutdown();
,只要关闭操作未被取消。请参阅 Closing a Window 上的 MSDN 文档。
此外,由于 this.close()
是可取消的,您可以在关闭事件处理程序中放入保存更改确认对话框。只需为 <Window Closing="...">
创建一个事件处理程序并相应地更改 e.Cancel
。 (有关如何执行此操作的更多详细信息,请参阅 MSDN documentation。)
根据需要使用以下任何一项:
1.
App.Current.Shutdown();
OR
Application.Current.Shutdown();
2.
App.Current.MainWindow.Close();
OR
Application.Current.MainWindow.Close();
最重要的方法将调用 Window
类的 closing event
并且执行可能会在某个时候停止(因为通常应用程序会发出 之类的对话'你确定?' 或“您想在关闭前保存数据吗?”,在窗口完全关闭之前)
3. 但是如果你想立即终止应用程序而没有任何警告。下面使用
Environment.Exit(0);
这是我的做法:
// 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();
总而言之,有几种方法可以做到这一点。
1)杀死进程,跳过终结,错误处理等:
Process.GetCurrentProcess().Kill();
2)关闭当前应用程序,这可能是正确的方法,因为它调用了退出事件:
Application.Current.Shutdown();
或者
this.Shutdown();
(当在 App 类的实例中调用时)
3)关闭当前应用程序(所有表格必须提前关闭/完成):
this.Close();
(当在 App 类的实例中调用时)
4)退出环境,这会终止应用程序:
Environment.Exit(0);
此外,您可能想了解退出状态here
您可以这样做的另一种方法:
System.Diagnostics.Process.GetCurrentProcess().Kill();
这将强制终止您的应用程序。它始终有效,即使在多线程应用程序中也是如此。
注意:请注意不要在另一个线程中丢失未保存的数据。
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);
}
尝试
App.Current.Shutdown();
为了我
Application.Current.Shutdown();
没用。
据我了解,Application.Current.Shutdown()
也有它的缺点。
如果您想显示一个确认窗口让用户确认是否退出,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 });
}
}
如果您使用 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());
App.Current.Shutdown();
写在你需要的地方。
如果(System.Windows.Forms.Application.MessageLoop)
{
// WinForms 应用程序
System.Windows.Forms.Application.Exit();
system.Environment.Exit(1);
}
Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
从 xaml 代码中,您可以调用预定义的 SystemCommand:
Command="SystemCommands.MinimizeWindowCommand"
我认为这应该是首选方式...
不定期副业成功案例分享
Application.Current.Shutdown();
,您的函数将不会立即返回。为此,您还需要调用return;
。Application
不是静态类。拥有Application.Current
静态成员并不意味着它是静态的。相反,它是一个可以派生的普通类。