关于c#:如何以编程方式退出WPF应用程序?

How do I exit a WPF application programmatically?

在这几年里,我一直在使用C(Windows窗体),我从来没有使用过WPF。但是,现在我喜欢WPF,但是我不知道当用户单击"文件"菜单中的"退出"菜单项时,该如何退出我的应用程序。

我已经尝试过:

1
2
3
4
5
this.Dispose();
this.Exit();
Application.ShutDown();
Application.Exit();
Application.Dispose();

在许多其他方面。没有效果。


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

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

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

Shutdown is implicitly called by Windows Presentation Foundation (WPF) in the following situations:

  • When ShutdownMode is set to OnLastWindowClose.
  • When the ShutdownMode is set to OnMainWindowClose.
  • When a user ends a session and the SessionEnding event is either unhandled, or handled without cancellation.

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


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

使用方法如下:

1
Environment.Exit(0)


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

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

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


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

1。

1
2
3
 App.Current.Shutdown();
OR
 Application.Current.Shutdown();

2。

1
2
3
 App.Current.MainWindow.Close();
OR
 Application.Current.MainWindow.Close();

最重要的是,所有方法都将调用Window类的closing event,并且执行可能会在某个点停止(因为通常应用程序会放置类似"确定吗?"的对话)。或者"是否要在关闭前保存数据?",在窗户完全关闭之前)

三。但如果您希望立即终止应用程序而不发出任何警告。使用如下

1
   Environment.Exit(0);

这应该可以做到:

1
Application.Current.Shutdown();

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

有关应用程序的详细信息。当前

WPF应用程序生命周期


以下是我的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 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 closer,那么Window_Closing(...)会在用户确认的情况下抓取事件关闭。

实际上,我在主窗口中使用Application.Current.Shutdown()的原因是,我注意到,如果发生了设计错误,并且我没有在应用程序中声明某个窗口的父级,如果在上次活动窗口关闭之前未显示该窗口,则会留下一个隐藏窗口在后台运行。应用程序将不会关闭。防止完全内存泄漏的唯一方法是进入任务管理器关闭应用程序。Application.Current.Shutdown()保护我不受意外设计缺陷的影响。

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


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

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

1
Application.Current.Shutdown();

另一种方法是:

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

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

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


尝试

1
App.Current.Shutdown();

为了我

1
Application.Current.Shutdown();

不起作用。


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

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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);
}


Caliburn微香型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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.ShutdownMode = ShutdownMode.OnExplicitShutdown;


从XAML代码中,可以调用预定义的系统命令:

1
Command="SystemCommands.MinimizeWindowCommand"

我认为这应该是最好的方式…