2012-09-05 45 views
2

什麼是可靠(並且立即)檢測用戶是否用ALT-F4或關閉手勢關閉了應用程序的方法?如何檢測用戶是否已關閉了一個winrt應用程序

+0

你指的是用戶關閉後它運行的代碼? – SLaks

+0

@ SLaks,是的,直接在用戶關閉它之後,系統已經引發暫停事件之前 – HCL

+0

這兩者之間是否有區別? –

回答

3

根據Application Lifecycle文檔,無法檢測到此事件(請參閱「應用程序關閉」下的部分)。使用ApplicationData類可以最好地管理這種類型的狀態。

4

對於我的具體問題,並不是一個確切的答案,而是一種解決了我發佈我的問題的具體問題的方法。也許這可以幫助別人:

註冊到Window.CoreWindow.VisibilityChanged

Window.Current.CoreWindow.VisibilityChanged += CoreWindow_VisibilityChanged; 

如果能見度已更改爲false,這可能是由於應用程序的關閉。保重,本次活動還將激發了許多其他的原因,比如通過使用Alt-Tab窗口的變化:

void CoreWindow_VisibilityChanged(CoreWindow sender, VisibilityChangedEventArgs args) { 
     if(!args.Visible){ 
      // Action here 
     } 
} 

請注意:我懷疑MS已經明確地沒有提供,我一直在尋找一個事件,因爲在用戶關閉應用程序的那一刻,嚴重的操作將導致流暢的用戶體驗。不過,我認爲有資格的情況下,這樣的事件是有道理的,因此人們會使用像我在這裏提供的解決方法。如果您使用此解決方案或其他解決方法,請注意不要給系統造成沉重的負擔。

+0

我必須同意這個答案。但是,我發現您還需要使用Unloaded事件,否則您可能會發現自己保存了舊頁面的狀態。我將添加我的筆記作爲可讀性的答案。 – swinefeaster

+0

確切地說Windows.UI.Xaml.Window.Current.VisibilityChanged –

1

毫無疑問,如果應用程序暫停,您不希望始終保存狀態。這不會被稱爲「投票」(這是有點不好,在其他方面浪費)?在我的場景中,我有一個跟蹤剩餘時間的計時器,這是應用程序狀態的一部分,但我不希望將其存儲在每個計時器上。

所以,要做到這一點正確,你將需要:

  1. 軌道VisibilityChanged(爲說明原來的海報)
  2. 軌道空載(只要你導航返回從頁等)
  3. 當頁面已被卸載,所以你不保存舊的緩存頁面可能被掛在

更詳細地說明#3以上

  • 軌道 - 我發現,如果我向前導航從A - > B,則回到A,然後再回到B,最後我會掛起另一個緩存的頁面B。然後,當用戶離開應用程序時,我會觸發多個VisibilityChanged事件,其中一些包括舊緩存的網頁,我認爲這些網頁會被銷燬但不是。

    這裏是爲我工作的代碼:

    public void MyPage() // Constructor 
    { 
        Loaded += (sender, e) => 
        { 
        if(!m_isLoaded) 
        { 
         m_isLoaded = true; 
    
         Window.Current.CoreWindow.VisibilityChanged += 
          OnVisibilityChanged; 
        } 
        }; 
    
        Unloaded += async (sender, e) => 
        { 
        if (m_isLoaded) 
        { 
         m_isLoaded = false; 
    
         Window.Current.CoreWindow.VisibilityChanged -= 
          OnVisibilityChanged; 
    
         await SaveStuff(); 
        } 
        }; 
    } 
    
    protected void OnVisibilityChanged(object sender, 
        Windows.UI.Core.VisibilityChangedEventArgs e) 
    { 
        if (!e.Visible && m_isLoaded) 
        { 
        var dontAwait = SaveStuff(); 
        } 
    } 
    
    // Called whenever the page is unloaded and state needs to be saved. 
    protected async Task SaveStuff() 
    { 
        await ThreadUtility.voidTask(); 
    } 
    
    // Set to false when the page is unloaded (paused). 
    private bool m_isLoaded = false; 
    
  • 相關問題