Windows Phone 8 換頁傳遞參數 兩種方法 Navigation 、PhoneApplicationService
為什麼要傳遞參數?可以用在那些地方呢?!
譬如說,假設有一個食譜的APP,裡面有食譜的清單,當我們點下其中一個餐點時則會跳到另一個頁面介紹餐點的製作方法,傳統的方法我們會一頁一頁製作餐點的內容,但這是非常不方便而且消耗開發者大量的腦力,所以傳遞參數可以幫務我們解決這個問題,只要將餐點編號傳遞到介紹餐點的頁面,我們再去資料庫或是網路抓相對應的資料,這樣就可以省下非常多的時間,專案也會相對的好管理囉!
為什麼要傳遞參數?!
可以用在那些地方呢?!
譬如說,假設有一個食譜的APP,裡面有食譜的清單,當我們點下其中一個餐點時則會跳到另一個頁面介紹餐點的製作方法,傳統的方法我們會一頁一頁製作餐點的內容,但這是非常不方便而且消耗開發者大量的腦力,所以傳遞參數可以幫務我們解決這個問題,只要將餐點編號傳遞到介紹餐點的頁面,我們再去資料庫或是網路抓相對應的資料,這樣就可以省下非常多的時間,專案也會相對的好管理囉!
首先我們準備兩個xaml的Page分別為A_Page與B_Page,等會兒我們會將參數從A_Page傳送至B_Page使用。
方法一 : 使用NavigationService
A_Page 當按鈕按下時寫入以下程式碼
可以一次傳送多個參數,Uri的字串部分像這樣子
?後面接的是參數
參數的名稱
參數的值
將參數區隔
/B_Page.xaml?Food_ID=Food_id&Food_Name= FoodName
A_Page:
String Food_Id =5; String FoodName="小籠包";
NavigationService.Navigate(new Uri("/B_Page.xaml?" + "Food_ID=" + Food_Id + "&Food_Name=" + FoodName , UriKind.Relative));
在B_Page的接收方法,在OnNavigatedTo的方法內加入以下程式碼
protected override void OnNavigatedTo(NavigationEventArgs e){
String Food_Id = "";
String FoodName = "";
if (NavigationContext.QueryString.TryGetValue("Food_Id", out Food_Id))
{
//成功將名稱是Food_Id的參數內容放置Food_Id變數
}
else {
//無法取得名稱為Food_Id的參數內容
}
if (NavigationContext.QueryString.TryGetValue("FoodName", out FoodName))
{
//成功將名稱是FoodName的參數內容放置FoodName變數
}
else
{
//無法取得名稱為FoodName的參數內容
}
}
這樣我們就可以將參數帶入B_Page使用囉!
方法二 : 使用PhoneApplicationService
這個方法說是傳遞參數,不如說是把參數放到一個A_Page和B_Page都可以存取的空間,剛剛所說的NavigationService只能傳遞String的參數,如果說我們想要傳送自定義的Object時怎辦?! 這就是NavigationService無法達成的功能,所以PhoneApplicationService可以來幫我們做這件事情!
假設我們要傳遞一個List<String>的物件。
A_Page寫入以下程式碼
List ls = new List();
ls.Add("5");
ls.Add("小籠包");
//自定義的參數名稱
String Param_Name = "My_Param";
//檢查參數使否已經存在
if (PhoneApplicationService.Current.State.ContainsKey(Param_Name))
{
//如果已經存在則刪除
PhoneApplicationService.Current.State.Remove(Param_Name);
}
//重新新增參數
PhoneApplicationService.Current.State.Add(Param_Name, ls);
//切換至B_Page頁面
NavigationService.Navigate(new Uri("/B_Page.xaml", UriKind.Relative));
B_Page接收的方法:
protected override void OnNavigatedTo(NavigationEventArgs e){
String Param_Name = "My_Param";
String Food_Id = "";
String Food_Name = "";
List ls;
ls = PhoneApplicationService.Current.State[Param_Name] as List;
//檢查參數是否有確實的傳遞
if (List_PhotoItems != null)
{
Food_Id = ls[0];
Food_Name = ls[1];
}
base.OnNavigatedTo(e);
}