2012-11-16 71 views
0

我在Windows Phone 7/8應用程序的應用程序關閉/取消激活方法中顯示MessageBox。它用於警告用戶,因爲應用程序正在關閉而禁用活動計時器。 App Closing/Deactivated事件對此非常完美,因爲在所有應用程序頁面中放置邏輯將成爲一個殺手 - 導航頁面和路徑太多。這工作得很好 - 消息框在WP7中顯示OK。我也知道breaking changes in the API of WP8。在那裏明確指出,在Activated和Launching中的MessageBox.Show會導致異常。MessageBox.Show in App關閉/取消激活事件

問題是,在WP8消息框沒有顯示在應用程序關閉。代碼無一例外地被執行,但是沒有消息出現。

P.S.我已經在MS WP Dev論壇上問過這個問題,但顯然沒有人知道。

回答

1

將msgBox代碼從應用程序關閉事件移動到主頁代碼隱藏中。覆蓋返回鍵按下事件並將您的代碼放在那裏。這是它是如何在做7.x版:

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) 
     { 
      if (MessageBox.Show("Do you want to exit XXXXX?", "Application Closing", MessageBoxButton.OKCancel) == MessageBoxResult.Cancel) 
      { 
       // Cancel default navigation 
       e.Cancel = true; 
      } 
     } 

僅供參考 - 在WP8它看起來像你必須派遣MSGBOX顯示一個新的線程。

這會在應用程序實際開始關閉事件模型之前提示用戶。如果用戶接受後退鍵,則允許按下,否則取消。您不能覆蓋主屏幕按鈕,必須始終立即進入主屏幕。您應該查看後臺代理以通過掛起/恢復來保存您的計時器代碼。

+0

它沒有用 - OnBackKeyPress仍然是一個頁面方法 - 所以我需要實現和維護它在10多頁。更糟糕的是,它沒有解決快速切換 - 沒有後退被按下:) – Kamen

+0

您仍然可以在App.xaml.cs中執行此操作:只需掛鉤到RootFrame的導航事件,並且只有觸發上述代碼(如果後臺堆棧是空的(即CanGoBack是假的) – dotMorten

+0

當然,Inkog沒有閱讀* breaking changes *鏈接,所以他沒有意識到他的代碼會使應用程序崩潰。您需要在*設置了'e.Cancel = true;'後調度* MessageBox.Show'調用! –

0

在RootFrame上註冊BackKeyPress事件。

RootFrame.BackKeyPress += BackKeyPressed; 
private void BackKeyPressed(object sender, CancelEventArgs e) 
    { 
     var result = (MessageBox.Show("Do you want to exit XXXXX?", "Application Closing", MessageBoxButton.OKCancel)); 
     if (result == MessageBoxResult.Cancel) 
     { 
      // Cancel default navigation 
      e.Cancel = true; 
     } 
}