桌面上的 UWP 由顶部 X 按钮关闭 - 无事件
本文关键字:事件 按钮 UWP 顶部 桌面 | 更新日期: 2023-09-27 18:32:24
顶部的 X 按钮关闭在桌面上运行的 UWP 应用,但它没有任何事件。众所周知,在手机和平板电脑上,应用程序应该依赖于Suspending
事件,无论它是如何触发的,然后应用程序应该依赖于ApplicationExecutionState
。
但是,这里有一个(可能)常见的场景:在手机上,Suspending
事件就足够了,如果正在进行VoIP呼叫,它将在应用程序暂停后由操作系统操作。在桌面上,用户应使用关闭按钮完全关闭应用。因此,如果呼叫正在进行中,则应将其挂起并释放某些资源。
如果(且仅当)UWP 应用在桌面上运行,我如何知道用户何时单击"关闭"按钮?
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
仍然可以取消。