桌面上的 UWP 由顶部 X 按钮关闭 - 无事件

UWP on desktop closed by top X button - no event

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

但是,这是一个(可能)常见的情况:在手机上 Suspending 事件就足够了,如果正在进行 Voip 通话,它将在应用程序暂停后由 OS 操作. 在桌面上,用户希望关闭按钮完全关闭应用程序。因此,如果通话正在进行,则应挂断并释放某些资源。

如果(且仅当)UWP 应用程序在桌面上 运行,我如何知道用户何时单击了 "close" 按钮?

我删除了 Window.Current.Closed event, because it doesn't seem to work if you have only one Window instance. There is also CoreApplication.Exiting, but judging by this 主题的原始答案,它也不起作用。似乎是已知问题,将来可能会修复。最后,似乎没有明确的方法来确定应用何时关闭,只有在暂停时才确定。

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

来自官方page 关于应用程序生命周期:

There's no special event to indicate that the user closed the app.

Closed-by-user behavior: If your app needs to do something different when it is closed by the user than when it is closed by Windows, you can use the activation event handler to determine whether the app was terminated by the user or by Windows.

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

在 Windows 10 版本 1703(内部版本 10.0.15063)中添加了 restricted capability confirmAppClose,以便为应用提供拦截 window 关闭的能力。

清单命名空间:

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

清单:

<Capabilities> 
  <Capability Name="internetClient" /> 
  <rescap:Capability Name="confirmAppClose"/> 
</Capabilities> 

提交到商店时需要额外的批准。但是随后将在 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 以阻止 window 关闭(用户取消提示).

此代码可以帮助您 -

App.xaml.cs

...
using Windows.ApplicationModel;
...

public App()
{
    InitializeComponent();            
    this.Suspending += OnSuspending;
}
...
private void OnSuspending(object sender, SuspendingEventArgs e)
{
    var deferral = e.SuspendingOperation.GetDeferral();
    //Add your logic here, if any
    deferral.Complete();
}

谢谢!!!

对于那些发现这个问题并寻找如何在 WinUI3 中确认关闭 Window 的人:

Window.Closed 事件参数有一个 Handled 属性 可以设置为 true 以取消关闭。

我真的很困惑Closed,对比WPF还是可以取消的