windowsphone中WebBrowser中的頁面按級回退功能

l_serein發表於2013-01-22

在windowsphone應用開發中,我們會常用到WebBrowser這個控制元件。它可以瀏覽網頁,並且可以在當前開啟的網頁中單擊超級連結,繼續開啟新的網頁。但是在操作中會存在這樣一個問題,當按"Back"鍵希望返回前一個(上一級)網頁時,程式會直接跳出當前的網頁瀏覽器,直接返回到上一頁面(客戶端程式頁面)。也就是說"Back"鍵會使程式返回程式的上一個PhoneApplicationPage,而不是WebBrowser中已開啟過的前一個網頁。

1.網頁回退

我們普遍的做法會首先禁用掉Back鍵的功能,然後通過網頁js的程式碼來實現網頁的回退功能。在js有兩種方法可以實現網頁回退:

(1)Browser.InvokeScript( "eval" , "history.go(-1)" );

(2)Browser.InvokeScript( "eval" , "history.back()" );

2.退出網頁/瀏覽器
上面的方法是不能使網頁退出,而返回到上一級的程式頁面的。那麼在網頁回到最初始頁面時,是要啟用Back的功能。為了在回退網頁時禁用Back鍵,而在退出網頁時啟用Back,可以使用一個計數器來模擬開啟的網頁棧---
計數器初始化為1。開啟新的網頁時,計數器加一;回退網頁時,計數器減一。當計數器記錄為1時,此時按Back鍵可以實現網頁的退出。

下面是簡要程式碼:

[csharp] view plaincopy
  1. using System;  
  2. using System.Windows.Navigation;  
  3. using Microsoft.Phone.Controls;  
  4.   
  5. namespace CustomControls  
  6. {  
  7.     public partial class ClockPage : PhoneApplicationPage  
  8.     {  
  9.         #region Data Members  
  10.   
  11.         // 用於點選開啟網頁(非back鍵操作引起的)次數的統計  
  12.         private int m_PageStackCount = 0;  
  13.         // 標誌是否為按Back鍵引起的網頁跳轉  
  14.         private bool m_BackKey = false;  
  15.  
  16.         #endregion  
  17.  
  18.         #region Constructor  
  19.   
  20.         public ClockPage()  
  21.         {  
  22.             InitializeComponent();  
  23.         }  
  24.  
  25.         #endregion  
  26.  
  27.         #region Protected Methods  
  28.   
  29.         protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)  
  30.         {  
  31.             // 返回到上一級頁面,此方法無法使網頁退出,也就是最後只能退回到首頁  
  32.             Browser.InvokeScript("eval""history.back()");  
  33.   
  34.             m_BackKey = true;  
  35.   
  36.             if (m_PageStackCount > 1)  
  37.             {  
  38.                 e.Cancel = true;  
  39.                 m_PageStackCount -= 1;  
  40.             }  
  41.             else  
  42.             {  
  43.                 // 退出網頁  
  44.                 e.Cancel = false;  
  45.             }  
  46.         }  
  47.   
  48.         private void Browser_Navigated(object sender, NavigationEventArgs e)  
  49.         {  
  50.             if (m_BackKey == false)  
  51.             {  
  52.                 m_PageStackCount += 1;                 
  53.             }  
  54.             else  
  55.             {  
  56.                 m_BackKey = false;  
  57.             }  
  58.         }  
  59.  
  60.         #endregion  
  61.     }  
  62. }  

相關文章