Windows Phone 7 Tip - 小心使用 OnNavigatedTo 事件

 在開發一個多頁面的Windows Phone 7應用程序的過程中,偶然發現與頁面導航(Page Navigation)有關的一些潛在“祕密”。

 

在我的應用中,頁面 A 的程序響應某按鈕的點擊事件,通過 NavigationService.Navigate() 方法跳轉到另一個頁面 B。而在 B 頁面中的 OnNavigatedTo 事件中,根據業務邏輯的需要,會進行一些判斷,然後在一些業務數據不滿足條件的情況下,會彈出消息對話框(採用MessageBox.Show()方法)。這一操作流程似乎沒有什麼問題。但經過細心的測試發現,在該消息對話框彈出後,如果用戶不做任何操作,大約10秒鐘後整個應用程序會被強行關閉。

而這一現象居然在聯機Debug時無法再現,只有通過應用程序列表直接運行起來纔會發生!

 

經過反覆試驗和推測,我認爲“強行關閉應用”這一步操作應該是由操作系統來處理的。再想想看,也相當合乎邏輯。我們可以嘗試在 B 頁面的 OnNavigatedTo 事件函數入口處設置一個斷點,然後在聯機 Debug 環境下觸發頁面跳轉。你會看到,在該事件被觸發的那一刻,頁面 A 仍顯示在手機屏幕中,表明頁面導航尚未結束,正處於進行過程中。而在此時彈出 MessageBox 對話框,恰恰阻礙了頁面跳轉的順利進行,使其處於“卡死”狀態(MessageBox.Show()方法會令程序流停止於該語句調用的地方,並在用戶對消息對話框進行響應後繼續)。而根據 Windows Phone 7 的相關 Development Guide,頁面處於停滯狀態達10秒者,殺無論。這就解釋了爲什麼在上述例子中,當用戶在10秒內不作出任何響應,應用程序就會被強行關閉了。

從這個角度出發,我們也不難猜想,如果在 OnNavigatedTo 事件中試圖執行一些“重量級”操作,導致進程停滯達10秒以上時,同樣也會被系統強行關閉。

 

用圖示來描述本文內容:

 

如果一定要在剛剛跳轉到 B 頁面時就執行必要的處理邏輯,並彈出 MessageBox 的話,可以考慮使用 B 頁面的 Loaded 事件。該事件的觸發時間稍晚於 OnNavigatedTo 事件,但此時整個頁面導航已經執行完畢,A 頁面已完全退出手機屏幕。因此,在 Loaded 事件裏彈出 MessageBox 是比較安全的。但值得注意的是,Loaded 事件僅在進入該頁面時觸發一次,而 OnNavigatedTo 事件則在每次顯示該頁面時都會被觸發(例如:在顯示 B 頁面的狀態下按 Start 按鈕或 Search 按鈕,然後再按下 Back 鍵回到 B 頁面時)。

 

有興趣的朋友可以下載示例代碼來實測一下:

下載代碼

 

希望本文能夠給開發 Windows Phone 7 多頁面應用程序的朋友起到提醒的作用。

 


作者: 李靖南

出處:http://elecpiano.blog.51cto.com/   

Email: [email protected] 

新浪微博: http://weibo.com/zengnami

MSN: [email protected]

QQ: 52717278 


關於作者:

從事微軟平臺解決方案的設計與實現。主要專注於 Windows 8 及 Windows Phone 7 應用開發,及前者與微軟雲計算平臺(Azure)的結合。

 

本文版權歸作者和51CTO共有,歡迎轉載,但未經作者同意則必須保留此段聲明,並在文章較明顯位置給出原文連接。非常感謝!

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章