如何以编程方式退出WPF应用程序?

当用户从文件菜单中单击退出菜单项时,应该如何退出应用程序?

我试过:

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

还有很多其他的。没有什么工作。

436749 次浏览

这应该可以达到目的:

Application.Current.Shutdown();

如果你感兴趣,这里有一些我认为有用的额外材料:

申请详情。当前的< / >

WPF应用程序生命周期

要退出应用程序,您可以调用

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

正如在Application.Shutdown方法的文档中所描述的,你也可以通过指定ShutdownMode来修改应用程序的关闭行为:

在以下情况下,Windows Presentation Foundation (WPF)会隐式调用Shutdown:

  • 当ShutdownMode设置为OnLastWindowClose时。
  • 当关机模式设置为OnMainWindowClose时。
  • 当用户结束会话,而SessionEnding事件未被处理或在未取消的情况下被处理时。

还请注意,Application.Current.Shutdown();只能从创建Application对象的线程调用,即通常是主线程。

不应该有Application.ShutDown();.Exit()消息。

Application是静态类。它不指向当前应用程序。 您需要进入当前应用程序,然后像这样关闭它:

Application.Current.Shutdown();

根据我的理解,Application.Current.Shutdown()也有它的缺点。

如果你想显示一个确认窗口让用户确认是否退出,Application.Current.Shutdown()是不可逆的。

wuminqi说一样,Application.Current.Shutdown();是不可逆的,我认为它通常用于在用户注销或关闭Windows时强制应用程序关闭。

相反,在主窗口中调用this.close()。这与在窗口上按Alt + F4或关闭[x]按钮相同。这将导致所有其他拥有的窗口关闭,并最终调用Application.Current.Shutdown();,只要关闭操作没有取消。请参阅MSDN文档关闭窗口

此外,由于this.close()是可取消的,您可以在关闭事件处理程序中放入一个保存更改确认对话框。只需为<Window Closing="...">创建一个事件处理程序,并相应地更改e.Cancel。(有关如何做到这一点的更多细节,请参阅MSDN文档。)

如果你真的需要它来结束,你也可以使用Environment.Exit (),但这一点都不优雅(更像是结束进程)。

使用方法如下:

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()保护我免受意外的设计缺陷。

这是我个人的经验。最后,使用最适合您的场景的方法。这只是另一条信息。

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

没有工作。

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

根据需要使用以下任何一种方法:

1.

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

2.

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

以上所有方法都将调用Window类的closing event,执行可能会在某个时候停止(因为通常应用程序会在窗口完全关闭之前放置像你确定吗?' < / em >关闭前是否保存数据?< / em >这样的对话)

但是如果您想立即终止应用程序没有任何警告。使用下面的

   Environment.Exit(0);

另一种方法是:

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

这将强制终止应用程序。它总是有效的,即使在多线程应用程序中也是如此。

注意:注意不要在另一个线程中丢失未保存的数据。

在xaml代码中,你可以调用一个预定义的SystemCommand:

Command="SystemCommands.MinimizeWindowCommand"

我认为这应该是首选的方式……

# EYZ0

总结一下,有几种方法可以做到这一点。

1)终止进程,跳过结束,错误处理等:

Process.GetCurrentProcess().Kill();

关闭当前应用程序,这可能是正确的方式,因为它调用退出事件:

Application.Current.Shutdown();

this.Shutdown();

(当在app类的实例中调用时)

关闭当前应用程序(所有表单必须提前关闭/完成):

this.Close();

(当在app类的实例中调用时)

4)退出环境,终止应用程序:

Environment.Exit(0);

此外,您可能需要阅读退出状态在这里

如果您想退出另一个没有创建应用程序对象的线程,请使用: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());
< p > # EYZ0

if (System.Windows.Forms.Application.MessageLoop)
{
// WinForms app
System.Windows.Forms.Application.Exit();
system.Environment.Exit(1);
}