有朋友問起Windows Phone 7頁面導航(Page Navigation)時,如何在不同頁面之間進行傳遞參數。我們在此整理一下。
Windows Phone 7的頁面間傳參有三種方式。為了方便描述,我們將情境設定為:從A頁面導航到B頁面。
第一種方法:QueryString
這種傳參方式繼承自傳統的網頁開發模式。在A介面中,調用 NavigationService.Navigate() 方法時,所傳遞的Uri不僅僅是B頁面的xaml檔案地址,還包括字串格式的參數。具體格式如下:
"/PageB.xaml?param1=stringValue1¶m2=stringValue2"
xaml檔案地址後跟一個問號,代表參數聲明的開始。多個參數用 & 符號間隔。
而在B頁面中,需要重載基類的 OnNavigatedTo 方法,並從中獲得所傳遞的參數值,範例程式碼如下:
string paramValue1 = NavigationContext.QueryString["param1"];
string paramValue2 = NavigationContext.QueryString["param2"];
該傳參方式簡單易用,唯一的不足之處是僅支援字串類型。
第二種方法:全域參數
在 App.xaml.cs 檔案中的 App 類中,定義任意類型的 public 屬性(例如param3)。
在A頁面中,設定該屬性變數值,代碼如下:
(App.Current as App).param3 = someValue;
在B頁面中,訪問該變數,代碼如下:
someVariable = (App.Current as App).param3;
這種傳參方式非常靈活,支援全域訪問。
第三種方法:NavigationEventArgs.Content
其實即將離開A頁面時,可以得到前往頁面的執行個體(頁面導航時,首先建立B頁面的執行個體,再把當前顯示內容從A頁面替換為B頁面)。因此,我們可以探知導航的目標頁面是否是B頁面,如果是,就向B頁面“注入”一些內容。
A頁面代碼如下:
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
var targetPage = e.Content as PageB;
if (targetPage!=null)
{
targetPage.param4 = someValue;
}
}
B頁面代碼如下:
public ParamType param4 { get; set; }
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
if (param4 != null)
{
textBlock3.Text = param4.Name;
}
}
該方法同樣支援各種參數類型。
以上各種參數傳遞的方式,孰優孰劣,就見仁見智了。
也許還會有人補充說,某些framework(例如prism、MVVMLightToolkit等) 還支援更多中傳參方式(如messaging),但個人感覺那些東東簡直”飛機拉馬車“,不太適合小規模的手機應用開發。
OK,希望對各位有所協助!代碼送上:
下載代碼