桌面上的UWP由顶部X按钮关闭 – 没有事件

在桌面上运行的UWP应用程序可以从顶部X按钮关闭,但它没有任何事件。 众所周知,在手机和平​​板电脑上,应用程序应该依赖Suspending事件,无论它是如何触发的,然后应用程序应该依赖于ApplicationExecutionState

然而,这是一个(可能)常见的场景:在手机上Suspending事件就足够了,如果正在进行Voip调用,它将在应用程序暂停后由OS操作。 在桌面上,用户希望关闭按钮完全关闭应用程序。 因此,如果正在进行呼叫,则应该挂起并且应该释放某些资源。

当(并且仅当)UWP应用程序在桌面上运行时,如何知道用户何时单击“关闭”按钮?

在Windows 10版本1703(版本10.0.15063)中添加了受限制的能力 confirmAppClose ,以便为应用程序提供拦截窗口关闭的function。

清单命名空间:

 xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" 

表现:

     

提交到商店时需要额外的批准。 但随后将在SystemNavigationManagerPreview实例上触发CloseRequested事件。

码:

  public MainPage() { this.InitializeComponent(); SystemNavigationManagerPreview.GetForCurrentView().CloseRequested += this.OnCloseRequest; } private void OnCloseRequest(object sender, SystemNavigationCloseRequestedPreviewEventArgs e) { if (!saved) { e.Handled = true; SomePromptFunction(); } } 

你可以在这里做一些延迟工作(保存或提示),或者你可以将Handled设置为true以阻止窗口关闭(用户取消提示)。

从官方页面了解应用程序生命周期:

没有特殊事件表明用户关闭了应用程序。

逐个用户行为:如果您的应用程序在用户关闭时需要执行与Windows关闭时不同的操作,您可以使用激活事件处理程序来确定应用程序是由用户还是由Windows终止。

因此,根据这一点, 没有(明确的)方法可以知道用户是否在应用程序关闭之前关闭了应用程序 ,但只有在重新启动之后才能关闭应用程序。 太糟糕了。

我使用Window.Current.Closed事件删除了我原来的答案,因为如果你只有一个Window实例它似乎不起作用。 还有CoreApplication.Exiting ,但从这个主题判断它也不起作用。 似乎是将来可能会修复的已知问题。 最后,似乎没有明确的方法来确定应用程序何时关闭,只有在它被暂停时。

但是,当应用程序关闭时, Window.Current会触发VisibilityChanged事件。 问题是,当应用程序最小化时,它也会被触发,也可能在某些其他情况下被触发。 但我认为结合Suspending你可以(或多或少)安全地确定桌面应用程序正在关闭。 好的是, VisibilityChangedSuspending之前解雇了你可以保存它的值并在OnSuspending处理程序中检查它,之后决定你是否需要进行任何清理或其他工作。