如何通过编程方式退出或关闭UWP应用程序?(Windows 10)

37
我需要为他们自己添加一个退出按钮。请告诉我如何做? 我尝试了这个: this.Close(); //或 Exit 不能用

3个回答

75
你可以使用 CoreApplication 类,它提供了一个静态退出方法
public void CloseApp()
{
    CoreApplication.Exit();
}

然而,文档中指出:

注意 不要在测试或调试场景之外使用此方法来关闭应用。

遗憾的是,背后的原因未知。


此外,您可以使用老式的非静态方法Application.Exit

public void CloseApp()
{
    Application.Current.Exit();
}

在这里你还应该查看备注:

使用此方法来提供用户退出应用程序的UI。但通常情况下,您不应提供此UI,因为系统会自动管理应用程序生命周期并在需要释放资源时终止挂起的应用程序。

简而言之: 两种Exit方法都将终止应用程序,而不是将其挂起。 您应该问自己,这真的是您想要执行的操作吗。


2
原因是程序化关闭应用违反了用户体验指南。 - Nuwan Karunarathna
Application.Current.Exit() 可能导致灾难性的失败。 - Gavin Williams
1
如果UX指南不支持通过编程方式关闭应用程序,则该指南是不充分的。这一条款将单方面拒绝在Windows上运行的每个游戏的设计。 - Gavin Williams
@GavinWilliams,您能否澄清一下您所说的“灾难性”是什么意思?您能否举出几个例子或提供一些关键词进行搜索?我在这方面找不到任何信息。 - Chris Tophski

20

这是退出 UWP 应用程序的官方支持方式:

Application.Current.Exit();

然而,你应该使用它的情况相对较少。仔细考虑与使用此方法相关的 UI 体验场景。例如,如果某些帐户已过期或远程管理的安全权限已被撤销,则可以通过编程方式退出应用程序。很少有人会在屏幕中央放置自己的“退出”按钮,而不违反 Windows 指南。


12
“你在屏幕中间拥有自己的“退出”按钮是罕见的……” - 实际上这是非常普遍的,因为几乎所有的游戏都有退出按钮! - Gavin Williams
4
如果一个桌面应用程序只能全屏运行,你还有什么其他方法退出它? - dynamichael
5
(1) 这种方法不起作用。它似乎破坏了主窗口,但调试器告诉我程序仍在运行。 (2) 如果用户没有登录凭据,您还打算对该应用程序进行什么其他操作?你会让屏幕永远停留在那里吗? - Quark Soup

9
如果你希望暂停应用程序而不是终止它,请尝试使用ApplicationView.TryConsolidateAsync()。例如,如果应用程序只实现了一个ApplicationView,请尝试调用ApplicationView.GetForCurrentView().TryConsolidateAsync()来关闭应用程序。
这种方法的明显好处是应用程序会像在标题栏中按关闭按钮一样优雅地关闭,关闭过程的动画也相同,应用程序会被暂停而不是突然退出。
此外,通过此方法关闭应用程序后,再次启动应用程序时,应用程序以与之前关闭时相同的位置和大小启动,而使用Application.Current.Exit()CoreApplication.Exit()则无法保证应用程序将以相同的位置和大小启动。

3
+1。不知道这个方法。文档中说:“此方法是程序化等效于用户启动关闭手势的应用视图。”,因此它似乎比其他方法更好。 - Xam
1
是的,这是推荐使用的方法。 - Soumya Mahunt
这个很好用。我在想为什么 SystemNavigationManagerPreview.GetForCurrentView().CloseRequested 事件没有被调用。 - pinki
如果窗口是主窗口,它可能不会被调用,如果您正在手动关闭,为什么不在那之前添加您的函数??您能描述一下为什么需要订阅此事件吗?? - Soumya Mahunt
ApplicationView.GetForCurrentView().TryConsolidateAsync() 可能会抛出异常 - 找不到元素。 - Gavin Williams
@Gavin Williams 我找不到关于“元素未找到”异常的文档,但看起来你在ApplicationView创建之前就尝试调用该方法,因此出现了错误。你能描述一下何时出现这个异常吗? - Soumya Mahunt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接