2012-08-07 107 views
4

我在Windows Phone應用程序的工作,這裏的情景,我有問題:Windows Phone的頁面導航

所以我有三個頁面,讓我們把它叫做頁面1,2,3

在第1頁,我有一個叫做start downloading的按鈕。單擊該按鈕並使用NavigateService.Navigate(page2Uri)並導航到page2。因爲在OnNavigateTo處理程序中,我檢查頁面回棧,如果從頁面1導航,我將執行下載。在這個頁面的應用欄中,我有一個可以導航到page3的按鈕。

第3頁是將在第2頁下載的圖像上執行某些行爲的選項列表。一旦我選擇了一個選項,我想回到第2頁並對加載的圖像執行一些操作。
這裏的問題是:
如果我使用NavigateService.Navigate(page2Uri)從page3導航到page2,它將再次調用Page2構造函數和OnNavigateTo處理程序,這將導致它丟失它已獲得的每個實例變量。
但是,如果我使用NavigatService.GoBack它將返回到page2,然後意識到backstack top條目是page1(因爲page1 - > page2 - > page3)。所以它會重新下載一切。

我不想在將表單page3導航回page2時再次下載任何東西。所以想知道如果任何人有這個好主意。

謝謝。

回答

2

有幾種方法將數據傳遞到另一個頁面:

  • 您可以使用查詢參數肖恩建議。
  • 您可以使用存儲在app.cs中某處的全局數據
  • 您可以使用靜態類來保存數據。
  • 您可以使用共享viewModel來保存參數。 (或視圖模型中的靜態屬性)

這一切都取決於具體情況。我認爲Shawns提出的使用查詢參數的建議可能是最正確的MVVM方法,但其他方法有其自己的位置。

5

您可以使用查詢參數和NavigationEventArgs來提供幫助。

首先,您可以使用NavigationEventArgs通過檢查NavigationMode來確定用戶是前進還是後退。

其次,您可以通過使用查詢參數來告訴頁面2進行下載。

從第1頁:

private void MoveToPage2FromPage1() 
{ 
    NavigationService.Navigate(new Uri("/Page2.xaml?shouldDownload=true", UriKind.Relative)); 
} 

和第2頁:

protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
    if (e.NavigationMode == NavigationMode.Back) return; 

    string shouldDownload = ""; //May not be needed if you'll only ever go to page 2 from page 1 to download... 
    if (NavigationContext.QueryString.TryGetValue("shouldDownload", out shouldDownload)) 
    { 
     Convert.ToBoolean(shouldDownload); 
    } 
} 
+0

謝謝肖恩,我喜歡你的回答,這應該是處理這類問題的標準和正確的方法。但我用Jon的想法來保持頁面的全局狀態,並且它也可以完美地解決問題。 +1爲你的簡要答案。 – 2012-08-08 17:44:41

+3

請注意靜態/全局屬性。當應用程序墓碑時它們不會持續。確保定期保存全局數據(或至少在應用程序事件中) – 2013-08-30 14:46:33

0

您需要實現以下功能和導航服務。 這些代碼肯定會解決你的問題

兩個或多個參數,使用這個代碼

String download="true"; 
String file="image"; 
NavigationService.Navigate(new Uri("/Page3.xaml?download="+download+"&file="+file+"", UriKind.Relative)); 

的OnNavigatedTo,上添加以下代碼到你的第二頁

protected override void OnNavigatedTo(NavigationEventArgs e) 
     { 
      base.OnNavigatedTo(e); 
      String download=NavigationContext.QueryString["download"]; 
      String file=NavigationContext.QueryString["file"]; 

     } 

對於上述的OnNavigatedTo功能輸出真實和圖像。您可以使用MessageBox.Show();輸出