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 阻止用户点击关闭按钮退出软件,如何知道用户点击了关闭按钮git
在 UWP 中有限制的功能,须要在 Package.appxmanifest 中开启,关于限制的功能请看App capability declarationsgithub
拿到用户点击事件须要在 Package.appxmanifest 添加 confirmAppClose 功能windows
添加方法是点击 Package.appxmanifest 右击点查看代码网络
找到现有的 Capabilities 元素,默认一个空的 UWP 应用里面会添加网络功能,能够看到下面代码app
<Capabilities>
<Capability Name="internetClient" />
</Capabilities>
在这个元素里面再添加一项,请看代码异步
<rescap:Capability Name="confirmAppClose" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"/>
这里的 rescap 就是限制的意思,须要添加命名空间,添加以后的代码请看下面async
<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
触发的时候就是用户点击关闭按钮,或者用户在任务栏右击关闭应用spa
在 MainPage_CloseRequested
能够让应用延迟关闭或阻止应用关闭,以下面代码,我就不让用户关闭应用rest
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 能够做为字段保存,这样能够在执行完成更多代码以后才调用完成