534

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

我努力了:

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

在许多其他人中。没有任何效果。

4

18 回答 18

862

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

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

如该方法的文档中所述,您还可以通过指定ShutdownModeApplication.Shutdown来修改应用程序的关闭行为:

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

  • 当 ShutdownMode 设置为 OnLastWindowClose 时。
  • 当 ShutdownMode 设置为 OnMainWindowClose 时。
  • 当用户结束会话并且 SessionEnding 事件未处理或未取消处理时。

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

于 2010-05-12T15:39:31.997 回答
182

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

按如下方式使用它:

Environment.Exit(0)
于 2012-01-29T02:41:52.507 回答
78

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

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

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

于 2012-01-29T02:31:57.287 回答
39

根据需要使用以下任何一项:

1.

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

2.

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

最重要的是方法会调用closing eventWindow并且执行可能会在某个时候停止(因为通常应用程序会在窗口完全关闭之前发出“你确定吗?”或“你想在关闭之前保存数据吗?”这样的对话)

3.但是如果你想立即终止应用程序而没有任何警告。在下面使用

   Environment.Exit(0);
于 2016-01-22T18:33:21.763 回答
25

这应该可以解决问题:

Application.Current.Shutdown();

如果你有兴趣,这里有一些我觉得有帮助的附加材料:

Application.Current 的详细信息

WPF 应用程序生命周期

于 2010-05-12T15:38:55.897 回答
19

这是我的做法:

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

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

于 2014-02-08T01:20:01.110 回答
16

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

Application是一个静态类。它不涉及当前的应用程序。您需要访问当前应用程序,然后像这样将其关闭:

Application.Current.Shutdown();
于 2010-05-12T15:41:50.493 回答
12

您可以这样做的另一种方法:

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

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

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

于 2017-12-04T12:31:39.480 回答
12

总而言之,有几种方法可以做到这一点。

1)杀死进程,跳过终结,错误处理等:

Process.GetCurrentProcess().Kill();

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

Application.Current.Shutdown();

或者

this.Shutdown();

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

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

this.Close(); 

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

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

Environment.Exit(0);

此外,您可能想在此处阅读有关退出状态的信息

于 2019-12-18T14:55:16.107 回答
6
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);
}
于 2014-02-25T17:01:34.507 回答
6

尝试

App.Current.Shutdown();

为了我

Application.Current.Shutdown(); 

没用。

于 2015-03-25T12:56:39.043 回答
5

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

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

于 2010-05-13T05:24:30.370 回答
2

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 });
    }
}
于 2015-08-04T07:55:27.560 回答
0

App.Current.Shutdown();
把它写在你需要的地方。

于 2022-01-28T22:52:09.637 回答
0

如果您想从另一个没有创建应用程序对象的线程中退出,请使用:System.Windows.Application.Current.Dispatcher.InvokeShutdown()

于 2020-05-13T17:00:00.840 回答
-1

如果您使用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());
于 2021-10-14T13:45:38.830 回答
-2

Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;

于 2018-10-30T01:45:45.220 回答
-3

从 xaml 代码中,您可以调用预定义的 SystemCommand:

Command="SystemCommands.MinimizeWindowCommand"

我认为这应该是首选方式...

于 2018-06-16T09:42:15.627 回答