Windows Phone 7 - 頁面間傳值
分類: Windows Phone 7 2011-01-23 20:42 441人閱讀 收藏 舉報 在頁面間導(dǎo)航時傳遞參數(shù)的方式大致有3種,QueryString,全局變量和獨立存儲。本文只介紹前兩種傳值方式。
一.QueryString方式
?
在頁面1中的Button事件處理程序中添加了如下代碼:
[c-sharp] view plaincopy
private?void?btnMain_Click(object?sender,?RoutedEventArgs?e)??{???????string?target?=?"/SubPage.xaml";???????target?+=?string.Format("?InputText={0}",?txtInput.Text);???????this.NavigationService.Navigate(new?Uri(target,?UriKind.Relative));??}??
程序運行時這個Uri是這樣的:”/SubPage.xaml?InputText=Hello, Windows Phone 7!” 它的形式和HTML中的查詢字符串 (Query String)一樣,如果要傳遞多個參數(shù),可以用&來合并,例如: ”/SubPage.xaml?InputText=Hello, Windows Phone 7!&Name=Zhang Yin”。
頁面2中Button的Click事件處理程序代碼如下:
[c-sharp] view plaincopy
private?void?btnBack_Click(object?sender,?RoutedEventArgs?e)??{???????if?(this.NavigationService.CanGoBack)???????????this.NavigationService.GoBack();??}??
并且我在頁面2中重寫了OnNavigatedTo方法。OnNavigatedTo方法是定義在Page類中的, 所以PhoneApplicationPage也繼承了此方法,它是一個Virtual方法,所以需要用override關(guān)鍵字重寫。 OnNavigatedTo在頁面被創(chuàng)建后馬上會被調(diào)用,也就是說在OnNavigatedTo 方法被調(diào)用時,頁面的構(gòu)造函數(shù)已經(jīng)執(zhí)行完畢了。 類似的還有OnNavigatedFrom方法,它是在離開當(dāng)前頁面時觸發(fā)的。
頁面2中OnNavigatedTo方法內(nèi)的代碼如下:
[c-sharp] view plaincopy
protected?override?void?OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs?e)??{??????????????string?value?=?string.Empty;??????????????IDictionary<string,?string>?queryString?=?this.NavigationContext.QueryString;??????????????if?(queryString.ContainsKey("InputText"))??????????????{??????????????????txt.Text?=?queryString["InputText"];??????????????}??????????????base.OnNavigatedTo(e);??}??
Page類定義了一個類型為NavigationContext的NavigationContext屬性,它包含一個類型為IDictionary<string, string>的 QueryString屬性。判空檢測后,將InputText鍵對應(yīng)的值賦給文本框的Text屬性。 最后觸發(fā)基類的OnNavigatedTo方法以保證基類的功能正常。當(dāng)然也可以使用下面的代碼,效果是一樣的:
[c-sharp] view plaincopy
protected?override?void?OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs?e)??{??????????????string?value?=?string.Empty;??????????????IDictionary<string,?string>?queryString?=?this.NavigationContext.QueryString;??????????????queryString.TryGetValue("InputText",?out?value);??????????????if?(value?!=?null)??????????????{??????????????????txt.Text?=?value;??????????????}??????????????base.OnNavigatedTo(e);??}?? 通過QueryString雖然可以向一個頁面?zhèn)鬟f參數(shù),但卻無法回傳數(shù)據(jù),例如我在頁面2中將文本修改為“Windows Phone 7!”, 然后點擊“前往第1頁”按鈕,得到的還是初始的那個頁面。要解決這個問題,就需要使用全局變量了。
二.全局變量
對于全局變量來說,我們可以在項目中添加一個在整個程序生命周期中都能訪問到的類,將相應(yīng)的數(shù)據(jù)保存在這個類的屬性里。
不過現(xiàn)在我們不用自己動手做這些額外的工作了。項目中本身就有一個類滿足這個需求:App類。 App 類繼承自Application類。
通過Application的Current屬性就可以獲取到與當(dāng)前程序關(guān)聯(lián)的Application類實例,然后通 過轉(zhuǎn)換就可以得到App類實例。
程序中所有的頁面都可以訪問到這個App類,所以將我們要保存的數(shù)據(jù)放到App類中是最好不過了,免去了自己實現(xiàn)的麻煩。
在App類中添加一個公有的InputText屬性(C# 3.0的自動屬性) :
[c-sharp] view plaincopy
public?partial?class?App?:?Application??{???????public?string?InputText?{?get;?set;?}???????……??}?? 頁面1中的代碼如下:
[c-sharp] view plaincopy
protected?override?void?OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs?e)??????????{??????????????App?app?=?Application.Current?as?App;??????????????if?(app.InputText?!=?null)??????????????????txtPage1.Text?=?app.InputText;??????????????base.OnNavigatedTo(e);??????????}????????????protected?override?void?OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs?e)??????????{??????????????App?app?=?Application.Current?as?App;??????????????app.InputText?=?txtPage1.Text;??????????????base.OnNavigatedFrom(e);??????????}?? 我在OnNavigatedTo方法內(nèi),讀取App類的InputText值,為的是當(dāng)在頁面2中修改了文本后可以反映到頁面1中。
注意:OnNavigatedTo方法是在當(dāng)前頁面被激活(成為活動頁面)時調(diào)用的。
在OnNavigatedFrom方法中將文本框賦給App類的InputText屬性,供頁面2去讀取。
頁面2中的代碼如下:
[c-sharp] view plaincopy
protected?override?void?OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs?e)??????????{??????????????App?app?=?Application.Current?as?App;??????????????if?(app.InputText?!=?null)??????????????????txtPage2.Text?=?app.InputText;??????????????base.OnNavigatedTo(e);??????????}????????????protected?override?void?OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs?e)??????????{??????????????App?app?=?Application.Current?as?App;??????????????app.InputText?=?txtPage2.Text;??????????????base.OnNavigatedFrom(e);??????????}?? 頁面2中的操作與頁面1類似。這樣,當(dāng)我們再次將頁面2中的文本修改為“Windows Phone 7!”,然后點擊“前往第1頁”按鈕時,
就可以得到想要的結(jié)果了。
?
三.PhoneApplicationService類
類似于App類,我們還可以將要在多個頁面中訪問的數(shù)據(jù)保存在PhoneApplicationService的State屬性中。
它的類型是IDictionary<string, object>,所以我們可以保存任意對象,不過前提是這個對象是可序列化的(serializable)。
在程序中,我們無需自己創(chuàng)建的實例,通過PhoneApplicationService的靜態(tài)屬性Current就可以獲取到已有的實例。
注意:在程序中訪問PhoneApplicationService類需要添加下面的名稱空間:
usingMicrosoft.Phone.Shell;
程序代碼如下,頁面1中的代碼如下:
[c-sharp] view plaincopy
protected?override?void?OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs?e)??????????{??????????????if?(PhoneApplicationService.Current.State.ContainsKey("InputText"))??????????????{??????????????????txtPage1.Text?=?PhoneApplicationService.Current.State["InputText"]?as?string;??????????????}??????????????base.OnNavigatedTo(e);??????????}????????????protected?override?void?OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs?e)??????????{??????????????PhoneApplicationService.Current.State["InputText"]?=?txtPage1.Text;??????????????base.OnNavigatedFrom(e);??????????}?? 頁面2中的代碼如下:
[c-sharp] view plaincopy
protected?override?void?OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs?e)??????????{??????????????if?(PhoneApplicationService.Current.State.ContainsKey("InputText"))??????????????{??????????????????txtPage2.Text?=?PhoneApplicationService.Current.State["InputText"]?as?string;??????????????}??????????????base.OnNavigatedTo(e);??????????}????????????protected?override?void?OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs?e)??????????{??????????????PhoneApplicationService.Current.State["InputText"]?=?txtPage2.Text;??????????????base.OnNavigatedFrom(e);??????????}?? 四.關(guān)于OnNavigatedTo和OnNavigatedFrom方法
我覺得這兩個方法的名字起的不太好,有時候容易混淆,如果把OnNavigatedTo改為OnNavigatedToThisPageFromOther,
把OnNavigatedFrom改為OnNavigatedFromThisPageToOther就會很清晰了,當(dāng)然這只是幫助我們記憶的一種方法了。
下面是MSDN中對這兩個方法的一些建議:
OnNavigatedTo:重寫 OnNavigatedTo 方法以檢查導(dǎo)航請求并且準(zhǔn)備供顯示的頁面。
例如,可以加載請求的數(shù)據(jù)并且啟用或禁用可視化元素。通常是使用?OnNavigatedTo?方法,而非為?Loaded?事件創(chuàng)建事件處理程序。
最好使用 OnNavigatedTo 方法,因為只在每次頁面成為活動頁面時調(diào)用該方法一次。
Silverlight 框架在每次將元素添加到可視化樹時引發(fā)?Loaded?事件,在激活某一頁面時該事件可能會多次發(fā)生。
OnNavigatedFrom:重寫 OnNavigatedFrom 方法以便在頁面成為非活動時對該頁面執(zhí)行最后的操作。
例如,可以更新與該頁面相關(guān)的數(shù)據(jù)。通常是使用?OnNavigatedFrom?方法,而非為?Navigated?事件創(chuàng)建事件處理程序。
最好使用 OnNavigatedFrom 方法,因為不必再從?NavigationService?對象移除事件處理程序以避免對象生存期問題。
轉(zhuǎn)載于:https://www.cnblogs.com/songtzu/archive/2012/04/11/2442069.html
總結(jié)
以上是生活随笔為你收集整理的Windows Phone 7 - 页面间传值 来源-http://blog.csdn.net/dncts/article/details/6160067的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。