2019-7-4-win10-uwp-處理用戶點擊關閉按鈕

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 能夠做爲字段保存,這樣能夠在執行完成更多代碼以後才調用完成

本文使用的代碼放在 github 歡迎小夥伴訪問,若有問題請提 issus 或評論

相關文章
相關標籤/搜索