专栏首页dino.c的专栏[UWP]在应用退出时弹出确认提示框

[UWP]在应用退出时弹出确认提示框

1. 需求

在应用退出时(点击右上角的关闭按钮)弹出一个确认按钮可以说是一个最常见的操作了,例如记事本的“你是否保存”:

但这个功能在UWP上居然有点小复杂。这篇文章将解释如何实现这个功能。

2. CloseRequested

为了监视应用退出事件,我本来使用了CoreApplication.Exiting,但好像并不起作用,后来我就没再研究它的触发机制了。在Windows 10 Creators Update (15063)以后UWP提供了一个新的API:SystemNavigationManagerPreview.CloseRequested事件。这个事件会在用户点击窗体右上角的关闭按钮时触发,开发者可以在这个事件里处理保存数据、确认关闭等。最好在App.xaml.cs中的Window.Current.Activate();前后订阅这个事件。

Window.Current.Activate();

SystemNavigationManagerPreview.GetForCurrentView().CloseRequested += (s, e) =>
{
    //DO STH
};

3. 弹出确认提示框

CloseRequested事件包含一个名为SystemNavigationCloseRequestedPreviewEventArgs的EventArgs(名字真是超级长),它包含一个Handled属性,如果要取消关闭事件,可以将Handled设置为Ture,这点和WPF很像。SystemNavigationCloseRequestedPreviewEventArgs还提供了GetDeferral函数,它返回一个Deferral对象,它可以在异步操作中延迟UWP应用生命周期事件的执行,知道调用它的Complete方法。配合异步的ContentDialog,具体代码如下:

Windows.UI.Core.Preview.SystemNavigationManagerPreview.GetForCurrentView().CloseRequested +=
async (sender, args) =>
{
    var deferral = args.GetDeferral();

    var messageDialog = new ContentDialog
    {
        Title = "记事本",
        Content = "你想要保存更改吗?",
        PrimaryButtonText = "保存",
        SecondaryButtonText = "不保存",
        CloseButtonText = "取消"
    };

    messageDialog.DefaultButton = ContentDialogButton.Primary;

    var result = await messageDialog.ShowAsync();
    switch (result)
    {
        case ContentDialogResult.None:
            args.Handled = true;
            break;
        case ContentDialogResult.Primary:
            await SaveDataAsync();
            break;
        case ContentDialogResult.Secondary:
            break;
        default:
            break;
    }

    deferral.Complete();
};

private async Task SaveDataAsync()
{

}

在上面的代码中,如果点击取消按钮,则将Handled设置为true以取消关闭。点击确认则保存数据再关闭应用。无论选择哪个,最后都需要调用Deferral.Complete。最终运行效果应该如下(讲真,ContentDialog真的丑):

4. 添加应用功能声明

有没有发现上面"最终运行效果应该如下"中的应该两字是粗体?因为这时候上面的代码还是没有效果。究其原因,是因为confirmAppClose是一个受限功能,必须修改应用程序包清单源文件(Package.appxmanifest), 添加xmlns: rescap XML 命名空间声明,并声明受限功能。

<?xml version="1.0" encoding="utf-8"?>
<Package
    ...
    xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
    IgnorableNamespaces="... rescap">
...
<Capabilities>
    <rescap:Capability Name="confirmAppClose"/>
</Capabilities>
</Package>

这样,在本地运行的时候,应用终于可以弹出确认提示框了。一旦使用了受限功能,应在提交应用到Microsoft Store的时候提供信息以便获得批准,有一些功能只在极其特殊和有限的情况下才获准在提交到 Microsoft Store 的应用中使用,幸好这里时候的confirmAppClose很容易通过。在提交选项里会出现受限的功能这一节,如实填写就可以了,中文也可以。

这样,所有工作都做了,确认提示框功能终于完成了。

5. 然而还有BUG

我们知道UWP的应用生命周期中,在background 运行和suspended状态时应用基本处于暂停状态,也不会处理UI功能,这时候让它弹框?“除非你叫醒我,否则我罢工”。所以在应用不可视的状态下关闭应用,例如最小化的情况下在任务栏点击关闭窗口,程序能怎么办?

弹框是不可能弹的,只能装死了。

所以这时候程序就完全没有反应。当应用重新回到前台运行,确认框才会弹出来。不过只是个小小的bug,我们可以选择原谅它:

6. 参考

应用功能声明 - UWP apps Microsoft Docs

App package manifest - Windows UWP applications Microsoft Docs

SystemNavigationManagerPreview.CloseRequested Event (Windows.UI.Core.Preview) - Windows UWP applications Microsoft Docs

Deferral Class (Windows.Foundation) - Windows UWP applications Microsoft Docs

Windows 10 UWP 应用生命周期 - UWP apps Microsoft Docs

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [WPF]何如在Win7使用Aero2主题

    假设我在Windows10的环境新建一个4.6的WPF项目,添加一个ComboBox,并用Blend在这个ComboBox上右键“编辑模板”->“编辑副本”,B...

    dino.c
  • 另一种方法实现silverlight图片局部放大效果

      一時技痒于是也打算做一个出来。因为功能简单不如索性用纯xaml做,不写一行代码。当然,MouseDragElementBehavior这种东西也是要用到的,...

    dino.c
  • [UWP]用画中画模式(CompactOverlay Mode)让用总在最前端显示

    Windows 10 Creators Update以后UWP提供了一个新的视图模式CompactOverlay,中文翻译成 紧凑的覆盖层?反正大部分时间我们都...

    dino.c
  • cmd

    在 PC 行业的早期,大多数计算机完全是通过在命令行输入命令来操作的。 基于 Unix、CP / M、DR-DOS 等机器争夺地位和市场份额。 最终,MS-DO...

    iOSDevLog
  • MySQL备份调度器的实现

    对于MySQL方向的调度需求考虑了好久,总是感觉不够优雅,不够灵活。从我的感觉来看,如果设置成为crontab,其实管理起来是比较臃肿的。

    jeanron100
  • 开发便于运维的Windows服务

    过去几个月,DevOps on Windows网站推出了一系列文章,详细讲解了开发者应怎样创建便于运维的Windows服务。这一系列文章详细分析了如何克服在运维...

    张善友
  • 紧急预警 | 大量Windows 0-day漏洞泄漏,全球70%以上Windows服务器可被远程控制

    北京时间 2017 年 4 月 14 日晚,黑客团体Shadow Brokers (影子经纪人)再次泄露了一份 117.9 MB 的 NSA 机密文档,内含 2...

    安恒信息
  • GitHub 日收 7000 星, Windows 计算器项目开源即爆红!

    开源计算器意味着任何人都可以为改善这一 app 贡献代码,但微软会在实现新的功能原型、用户界面变动之前对它们进行评估或者审核代码。

    IT派
  • GitHub日收7000星,Windows计算器项目开源即爆红!

    昨日,微软官宣在 MIT 许可证下开源了 Windows 10 操作系统自带的计算器应用,源代码已托管在 GitHub 上。该项目发布即蹿红,在 GitHub ...

    AI科技大本营
  • GitHub日收7000星,Windows计算器项目开源即爆红!

    昨日,微软官宣在 MIT 许可证下开源了 Windows 10 操作系统自带的计算器应用,源代码已托管在 GitHub 上。该项目发布即蹿红,在 GitHub...

    AI科技大本营

扫码关注云+社区

领取腾讯云代金券