先看一張簡圖:
在程式中進行頁面的跳轉是再正常不過的事情了,但是在WP7的程式中,我們可能還需要多考慮一下後退按鈕給我帶來的“麻煩”。
在中的這種頁面結構中,假設在page2.xaml.cs中有如下代碼:
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (NavigationContext.QueryString.ContainsKey("id"))
{
string id= NavigationContext.QueryString["id"];
if (id=="1")
NavigationService.Navigate(new Uri("page3.xaml",UriKind.Relative));
}
}
儘管這個邏輯很奇怪,為什麼ID=1的時候就跳到PAGE3呢?哦,那不是我們討論的重點。
運行程式,現象如下:從Page1點擊某按鈕並傳遞id=1到Page2,然後Page2直接跳轉到了Page3.如果此時想後退,按手機左下角的[上一頁] 按鈕,問題來了!螢幕閃一下,又回到了Page3.原理很簡單,就是因為Page2每次OnNavigatedTo都判斷Url中是否有id這個參數,如果有就跳到了page3,不幸的是,在page3裡面按後退鍵,這個Url還是之前的帶參數的Url。
解決這個問題,可以加一行代碼解決:
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (NavigationContext.QueryString.ContainsKey("id"))
{
string id= NavigationContext.QueryString["id"];
if (id=="1")
{
NavigationContext.QueryString.Remove("id");
NavigationService.Navigate(new Uri("page3.xaml",UriKind.Relative));
}
}
}
NavigationContext.QueryString.Remove("id");這個語句可以把當前的Url中的某個參數移除掉。這樣再在page3裡面後退回page2,就能停在page2了。
NavigationContext.QueryString.Remove("")實際使用需求情形:為了避免OnNavigatedTo重複處理同一問題,以及上面說的的這種頁面跳轉情況(當然也可以用其他的方法避免這種複雜的跳轉)。