title author date CreateTime categories
win10 uwp 处理用户点击关闭按钮
lindexi
2019-07-04 09:28:57 +0800
2019-07-04 09:21:15 +0800
Win10 UWP

在 UWP 开发的时候,我做的文档软件需要在文档还没有保存的时候,用户点击关闭按钮的时候告诉用户需要保存。如何在 UWP 阻止用户点击关闭按钮退出软件,如何知道用户点击了关闭按钮

在 UWP 中有限制的功能,需要在 Package.appxmanifest 中开启,关于限制的功能请看App capability declarations

拿到用户点击事件需要在 Package.appxmanifest 添加 confirmAppClose 功能

添加方法是点击 Package.appxmanifest 右击点查看代码

找到现有的 Capabilities 元素,默认一个空的 UWP 应用里面会添加网络功能,可以看到下面代码

  <Capabilities>
<Capability Name="internetClient" />
</Capabilities>

在这个元素里面再添加一项,请看代码

    <rescap:Capability Name="confirmAppClose" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"/>

这里的 rescap 就是限制的意思,需要添加命名空间,添加之后的代码请看下面

  <Capabilities>
<Capability Name="internetClient" />
<rescap:Capability Name="confirmAppClose" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"/>
</Capabilities>

添加完成之后,就可以在代码里面使用,我在主页面的构造函数监听关闭事件,请看代码

            Windows.UI.Core.Preview.SystemNavigationManagerPreview.GetForCurrentView().CloseRequested += MainPage_CloseRequested;

MainPage_CloseRequested 触发的时候就是用户点击关闭按钮,或者用户在任务栏右击关闭应用

MainPage_CloseRequested 可以让应用延迟关闭或阻止应用关闭,如下面代码,我就不让用户关闭应用

        private async void MainPage_CloseRequested(object sender, SystemNavigationCloseRequestedPreviewEventArgs e)
{
// 让用户无法关闭
e.Handled = true; var messageDialog = new MessageDialog("欢迎访问 blog.lindexi.com 大量 UWP 博客", "骚年你确定关闭");
await messageDialog.ShowAsync();
}

只需要通过 e.Handled = true 就可以阻止用户关闭应用,就这样写出了一个用户无法快速退出的应用,基本上只能通过任务管理器才能退出

在我的软件里面作为文档软件需要在用户退出的时候发现有没有保存的文档就提示用户保存,也就是需要和上面代码差不多,给出提示。但是在 UWP 中的提示是异步的,也就是异步的提示无法阻止事件的继续,可以看到的是在用户点击关闭的时候,软件的提示页面还没显示,软件就关闭了

在 SystemNavigationCloseRequestedPreviewEventArgs 提供了延迟关闭的方法

在开始显示提示页面之前,调用 e.GetDeferral() 方法拿到返回值,在执行完成方法之后调用完成方法,请看代码

            var deferral = e.GetDeferral();

            var messageDialog = new MessageDialog("欢迎访问 blog.lindexi.com 大量 UWP 博客", "骚年你确定关闭");
await messageDialog.ShowAsync(); deferral.Complete();

上面代码的 deferral 可以作为字段保存,这样可以在执行完成更多代码之后才调用完成

本文使用的代码放在 github 欢迎小伙伴访问,如有问题请提 issus 或评论

2019-7-4-win10-uwp-处理用户点击关闭按钮的更多相关文章

  1. win10 uwp 保存用户选择文件夹

    如果我们每次把临时处理的文件保存,都要让用户选择一次,用户会不会觉得uwp垃圾?如果我们每次打开应用,都从某个文件读取,而这个文件不在应用目录和已知的目录,那么每次都需要用户选择,用户会不会觉得uwp ...

  2. Win10 UWP开发系列:实现Master/Detail布局

    在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...

  3. Win10 UWP 开发系列:使用SplitView实现汉堡菜单及页面内导航

    在Win10之前,WP平台的App主要有枢轴和全景两种导航模式,我个人更喜欢Pivot即枢轴模式,可以左右切换,非常方便.全景视图因为对设计要求比较高,自己总是做不出好的效果.对于一般的新闻阅读类Ap ...

  4. Win10/UWP开发—凭据保险箱PasswordVault

    PasswordVault用户凭据保险箱其实并不算是Win10的新功能,早在Windows 8.0时代就已经存在了,本文仅仅是介绍在UWP应用中如何使用凭据保险箱进行安全存储和检索用户凭据. 那么什么 ...

  5. Win10/UWP开发—使用Cortana语音与App后台Service交互

    上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...

  6. 【Win10 UWP】后台任务与动态磁贴

    动态磁贴(Live Tile)是WP系统的大亮点之一,一直以来受到广大用户的喜爱.这一讲主要研究如何在UWP应用里通过后台任务添加和使用动态磁贴功能. 从WP7到Win8,再到Win10 UWP,磁贴 ...

  7. 【Win10 UWP】URI Scheme(一):Windows Store协议的解析和使用

    协议是Windows Phone和Windows Store应用的一个重要特点,可以做到在不同应用之间进行互相呼起调用.小小协议,学问大着呢.我打算写几篇关于协议在UWP中使用的文章. 这一讲的主要对 ...

  8. Win10 UWP应用发布流程

    简介 Win10 UWP应用作为和Win8.1 UAP应用不同的一种新应用形式,其上传至Windows应用商店的流程也有了一些改变. 这篇博文记录了我们发布一款Win10 UWP应用的基本流程,希望为 ...

  9. 【Win10 UWP】QQ SDK(一):SDK基本使用方法

    每当开发一个应用需要社交分享的应用时,总是心里咯噔一下:到底什么时候分享能加上QQ和微信?除了WP8.0版本的微信SDK,官方似乎从未正面发布过适应时代发展的QQ SDK,就连后台,也没有一个可以创建 ...

随机推荐

  1. gulp入门之常见处理方式(三)

    整合 streams 来处理错误 默认情况下,在 stream 中发生一个错误的话,它会被直接抛出,除非已经有一个时间监听器监听着 error时间. 这在处理一个比较长的管道操作的时候会显得比较棘手. ...

  2. css3新特性概览

    一.特性 1.强大的选择器 2.半透明度效果的实现 3.多栏布局 4.多背景图 css3允许背景属性设置多个属性值,如:background-image,background-repeat,backg ...

  3. Java正则表达式实例详解

    创建正则表达式 你可以从比较简单的东西入手学习正则表达式.要想全面地掌握怎样构建正则表达式,可以去看JDK 文档的java.util.regex 的Pattern 类的文档. 字符 B 字符B \xh ...

  4. 公司jar包提交到集群的方法

    yarn -jar xx.jar 此时包会提交到集群上运行 也可以把jar包放到hbase 的lib下面用hbase jar 方式调用

  5. tortoisegit如何删除远程分支

    图片来自:https://zhidao.baidu.com/question/134542616148384045.html

  6. 前端(jQuery)(8)-- jQuery元素遍历

    1.向下遍历 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  7. Oil Deposits HDU - 1241 (dfs)

    Oil Deposits HDU - 1241 The GeoSurvComp geologic survey company is responsible for detecting undergr ...

  8. Struts_改写客户列表练习

    1.CustomerAction修改放入ActionContext 2.list.jsp使用struts标签库

  9. 火狐下button标签子元素无法点击

    button下元素点击事件:在chrome和safari下每个a标签可以点击,在火狐下a标签无法点击. <button> <a href="javascript:;&quo ...

  10. 存储过程详解 -SQLServer

    来源:http://www.cnblogs.com/knowledgesea/archive/2013/01/02/2841588.html 存储过程简介 什么是存储过程:存储过程可以说是一个记录集吧 ...