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

本文关键字:事件 按钮 UWP 顶部 桌面 | 更新日期: 2023-09-27 18:32:24

可以从

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

但是,这里有一个(可能)常见的场景:在手机上,Suspending事件就足够了,如果正在进行VoIP呼叫,它将在应用程序暂停后由操作系统操作。在桌面上,用户应使用关闭按钮完全关闭应用。因此,如果呼叫正在进行中,则应将其挂起并释放某些资源。

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

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

Windows

10 版本 1703(内部版本 10.0.15063)中添加了受限功能confirmAppClose,以便为应用提供拦截窗口关闭的功能。

清单命名空间:

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 以阻止窗口关闭(用户取消提示)。

来自有关应用生命周期的官方页面:

没有特殊事件指示用户关闭了应用。

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

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

这段代码可以帮助你 -

应用程序 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();
}

谢谢!!!

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

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

对于那些

发现此问题以寻求如何在WinUI3中确认关闭Window的人:

Window.Closed事件 args 有一个 Handled 属性,可以将其设置为 true 以取消收盘价。

我真的很困惑,与WPF相比,Closed仍然可以取消。