綜合很多資料,參數傳遞主要有四種方式:
1、通過NavigationContext的QueryString方式; 2、通過程式的App類設定全域變數(此方法可以傳遞對象); 3、通過NavigationEventArgs事件類別的Content屬性設定; 4、通過PhoneApplicationService類的State屬性。
1、通過NavigationContext的QueryString方式
這種傳參數方式最簡單最易理解,類似於web中的?id=1類型。 首先在A頁面挑戰到B頁面的uri中加入參數,如“/View/Music.xaml?id=1”; 在B頁面就可以接收了,如 int id = int.Parse(NavigationContext.QueryString["id"]); 注意:(1)一般在接收之前要判斷參數是否存在。 (2)同時傳遞多個參數可以使用“&”串連。 (3)地址別命中也可以使用這種方法,使用“{}”來表示變數。如 <nav:UriMapping
Uri="Music/{id}"
MappedUri="/View/Music.xaml?id={id}"></nav:UriMapping>
這樣設定後“Music/1”就相當於"/View/Music.xaml?id=1"。
2、通過程式的App類設定全域變數(此方法可以傳遞對象); 由於App 類繼承自Application類,而通過Application的Current屬性可以擷取到與當前程式關聯的Application類執行個體,然後通過轉換就可以得到App類執行個體,因此,通過在App類中設定全域變數,在程式的其他任何頁面都可以訪問。 (1)在App.xaml的App類中設定全域變數: public partial class App : Application { Public int ID { get; set; } } (2)在page1中設定: App app = Application.Current as App; app.ID = 1; (3)在page2中接收: App app = Application.Current as App; int id = app.ID; 補充:這種方法也可以通過App類的靜態屬性來傳遞對象: (1)首先我們建立一個MusicClass類: public class MusicClass { public string Name { set; get; } public string File { set; get; } } (2)在App類中添加靜態屬性: public static MusicClass Music { get; set; } (3)page1中設定參數: App.Music = new MusicClass { File = "song1.mp3", Name = "歌曲1" }; (4)page2中接收參數: App.Music = new MusicClass string musicFile = App.Music.File; string musicName = App.Music.Name;
3、通過NavigationEventArgs事件類別的Content屬性設定; 在導航至其他頁面函數OnNavigatedFrom中,測試導航的目標頁面是否為自己真正要轉向傳遞參數的頁面,如果是,可以通過NavigationEventArgs事件類別的向目標頁面注入一些"傳遞內容"。 protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
var targetPage = e.Content as Page2;
if (targetPage!=null)
{
targetPage.ID= 1;
}
}
然後page2取出參數值: public int ID { get; set; }
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
if (ID!= null)
{
int id = ID.ToString();
}
}
4、通過PhoneApplicationService類的State屬性。 由於PhoneApplicationService類的State是一個IDictionary類型,因此,可以儲存任何對象,不過這個對象必須是可序列化(serializable)的。 註:PhoneApplicationService類,需要訪問命名空間using Microsoft.Phone.Shell; 在程式中,可以不需要自己建立PhoneApplicationService的執行個體,通過PhoneApplicationService的靜態屬性Current就可以擷取到已有的PhoneApplicationService執行個體。
page1中設定參數: protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) { phoneAppService.State["id"] = int.Parse(myTextBox.Text);//擷取Page1頁面的值,進行傳遞; base.OnNavigatedFrom(e); }
page2中取出參數: protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgse) { if(PhoneApplicationService.Current.State.ContainsKey("id") { myTextBlock.Text=PhoneApplicationService.Current.State["id"] as string; } base.OnNavigatedTo(e); }
註:一般不用這種方法來傳遞參數,這種方法用的比較多的是記住頁面當前的狀態,跳回來後顯示剛才正在編輯的內容。
參考文章:http://blog.csdn.net/wangbole/article/details/7174663 http://www.cnblogs.com/elecpiano/archive/2011/11/14/2248378.html