日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Windows Phone 7 - 页面间传值 来源-http://blog.csdn.net/dncts/article/details/6160067

發布時間:2024/10/12 71 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windows Phone 7 - 页面间传值 来源-http://blog.csdn.net/dncts/article/details/6160067 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Windows Phone 7 - 頁面間傳值

分類: Windows Phone 7 441人閱讀 評論(0) 收藏 舉報

在頁面間導航時傳遞參數的方式大致有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)一樣,如果要傳遞多個參數,可以用&來合并,例如: ”/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關鍵字重寫。 OnNavigatedTo在頁面被創建后馬上會被調用,也就是說在OnNavigatedTo 方法被調用時,頁面的構造函數已經執行完畢了。 類似的還有OnNavigatedFrom方法,它是在離開當前頁面時觸發的。 頁面2中OnNavigatedTo方法內的代碼如下: [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鍵對應的值賦給文本框的Text屬性。 最后觸發基類的OnNavigatedTo方法以保證基類的功能正常。當然也可以使用下面的代碼,效果是一樣的: [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雖然可以向一個頁面傳遞參數,但卻無法回傳數據,例如我在頁面2中將文本修改為“Windows Phone 7!”, 然后點擊“前往第1頁”按鈕,得到的還是初始的那個頁面。要解決這個問題,就需要使用全局變量了。

    二.全局變量

    對于全局變量來說,我們可以在項目中添加一個在整個程序生命周期中都能訪問到的類,將相應的數據保存在這個類的屬性里。

    不過現在我們不用自己動手做這些額外的工作了。項目中本身就有一個類滿足這個需求:App類。 App 類繼承自Application類。

    通過Application的Current屬性就可以獲取到與當前程序關聯的Application類實例,然后通 過轉換就可以得到App類實例。

    程序中所有的頁面都可以訪問到這個App類,所以將我們要保存的數據放到App類中是最好不過了,免去了自己實現的麻煩。

    在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方法內,讀取App類的InputText值,為的是當在頁面2中修改了文本后可以反映到頁面1中。

    注意:OnNavigatedTo方法是在當前頁面被激活(成為活動頁面)時調用的。

    在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類似。這樣,當我們再次將頁面2中的文本修改為“Windows Phone 7!”,然后點擊“前往第1頁”按鈕時,

    就可以得到想要的結果了。

    ?

    三.PhoneApplicationService類

    類似于App類,我們還可以將要在多個頁面中訪問的數據保存在PhoneApplicationService的State屬性中。

    它的類型是IDictionary<string, object>,所以我們可以保存任意對象,不過前提是這個對象是可序列化的(serializable)。

    在程序中,我們無需自己創建的實例,通過PhoneApplicationService的靜態屬性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);??
  • ????????}??
  • 四.關于OnNavigatedTo和OnNavigatedFrom方法

    我覺得這兩個方法的名字起的不太好,有時候容易混淆,如果把OnNavigatedTo改為OnNavigatedToThisPageFromOther,

    把OnNavigatedFrom改為OnNavigatedFromThisPageToOther就會很清晰了,當然這只是幫助我們記憶的一種方法了。

    下面是MSDN中對這兩個方法的一些建議:

    OnNavigatedTo:重寫 OnNavigatedTo 方法以檢查導航請求并且準備供顯示的頁面。

    例如,可以加載請求的數據并且啟用或禁用可視化元素。通常是使用?OnNavigatedTo?方法,而非為?Loaded?事件創建事件處理程序

    最好使用 OnNavigatedTo 方法,因為只在每次頁面成為活動頁面時調用該方法一次。

    Silverlight 框架在每次將元素添加到可視化樹時引發?Loaded?事件,在激活某一頁面時該事件可能會多次發生。

    OnNavigatedFrom:重寫 OnNavigatedFrom 方法以便在頁面成為非活動時對該頁面執行最后的操作。

    例如,可以更新與該頁面相關的數據。通常是使用?OnNavigatedFrom?方法,而非為?Navigated?事件創建事件處理程序

    最好使用 OnNavigatedFrom 方法,因為不必再從?NavigationService?對象移除事件處理程序以避免對象生存期問題。

    轉載于:https://www.cnblogs.com/songtzu/archive/2012/04/11/2442069.html

    總結

    以上是生活随笔為你收集整理的Windows Phone 7 - 页面间传值 来源-http://blog.csdn.net/dncts/article/details/6160067的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。