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

时间:2010-05-12 15:37:12

标签: c# .net wpf shutdown

在我使用C#(Windows Forms)的几年里,我从未使用过WPF。但是,现在我喜欢WPF,但是当用户点击“文件”菜单中的“退出”菜单项时,我不知道应该如何退出应用程序。

我试过了:

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

其他许多人。什么都行不通。

16 个答案:

答案 0 :(得分:696)

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

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

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

  

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

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

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

答案 1 :(得分:140)

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

按如下方式使用:

Environment.Exit(0)

答案 2 :(得分:56)

作为wuminqi saidApplication.Current.Shutdown();是不可逆转的,我相信它通常用于强制应用程序关闭,例如当用户注销或关闭Windows时。

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

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

答案 3 :(得分:32)

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

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

答案 4 :(得分:24)

这应该可以解决问题:

Application.Current.Shutdown();

如果您有兴趣,这里有一些我觉得有帮助的其他材料:

Details on Application.Current

WPF Application LifeCycle

答案 5 :(得分:16)

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

Application是一个静态类。它不涉及当前的应用程序。 您需要转到当前应用程序,然后将其关闭,如下所示:

Application.Current.Shutdown();

答案 6 :(得分:16)

以下是我的做法:

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

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

答案 7 :(得分:6)

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

如果您想显示确认窗口以便用户确认退出,Application.Current.Shutdown()是不可逆转的。

答案 8 :(得分:6)

尝试

App.Current.Shutdown();

对我来说

Application.Current.Shutdown(); 

没用。

答案 9 :(得分:6)

另一种方法可以做到这一点:

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

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

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

答案 10 :(得分:5)

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

答案 11 :(得分: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 });
    }
}

答案 12 :(得分:1)

如果要退出另一个未创建应用程序对象的线程,请使用:System.Windows.Application.Current.Dispatcher.InvokeShutdown()

答案 13 :(得分:0)

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

1):终止进程,跳过最终确定,错误处理等操作:

Process.GetCurrentProcess().Kill();

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

Application.Current.Shutdown();

this.Shutdown();

(在应用程序类的实例中出现)

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

this.Close(); 

(在应用程序类的实例中出现)

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

Environment.Exit(0);

此外,您可能想了解有关退出状态here

答案 14 :(得分:-1)

Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;

答案 15 :(得分:-2)

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

Command="SystemCommands.MinimizeWindowCommand"

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