Windows Phone編程中頁(yè)面間傳值方法
WP開發(fā)過(guò)程中有時(shí)會(huì)遇到頁(yè)面間轉(zhuǎn)值的需求,如果定義兩個(gè)頁(yè)面,一個(gè)是初始頁(yè)面Source Page,另外一個(gè)是跳轉(zhuǎn)的頁(yè)面Destination Page,簡(jiǎn)單地分析主要有兩個(gè)方面的要求:
- 首先是在source page跳轉(zhuǎn)到destination page時(shí)給destination page頁(yè)面?zhèn)髦档膶?shí)現(xiàn);
- 然后是當(dāng)在destination page中調(diào)用goback函數(shù)回到source page時(shí)如何在source page傳值;
第一點(diǎn)系統(tǒng)本身提供了基本的實(shí)現(xiàn)方法,新建一個(gè)項(xiàng)目DataPassingDemo,然后新建一個(gè)頁(yè)面SecondPage.xaml,我們需要實(shí)現(xiàn)就是 從MainPage中跳轉(zhuǎn)到SecondPage中去,并傳遞參數(shù)讓SecendPage捕捉。首先在Mainpage中增加一個(gè)Textblock并且 增加事件處理函數(shù):
- <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
- <TextBlock Text="Navigate to 2nd page with data" HorizontalAlignment="Center"
- VerticalAlignment="Center" Padding="0 34"
- ManipulationStarted="TextBlock_ManipulationStarted"/>
- </Grid>
在Mainpage的后臺(tái)代碼中,實(shí)現(xiàn)TextBlock_ManipulationStarted方法如下:
- private void TextBlock_ManipulationStarted(object sender, ManipulationStartedEventArgs args)
- {
- string destination ="/SecondPage.xaml?parameter1=hello¶meter2=world";
- this.NavigationService.Navigate(new Uri(destination, UriKind.Relative));
- args.Complete();
- args.Handled =true;
- }
可以看到上面的那個(gè)destination是不是很像網(wǎng)頁(yè)間傳遞參數(shù)的形式呢?同理在SecondPage中增加一個(gè)Textblock,并給該 Textblock的ManipulationStarted事件中增加Goback()事件。同時(shí),為了捕捉MainPage傳遞過(guò)來(lái)的參數(shù),在 SecondPage的后臺(tái)代碼中實(shí)現(xiàn)下面的代碼:
- protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs args)
- {
- IDictionary<string,string> parameters =this.NavigationContext.QueryString;
- if (parameters.ContainsKey("parameter1"))
- {
- string parameter1 = parameters["parameter1"];
- string parameter2 = parameters["parameter2"];
- txtblk.Text = String.Format("Parameter1 is:{0} and parameter2 is:{1}", parameter1, parameter2);
- }
- base.OnNavigatedTo(args);
- }
通過(guò)重載OnNavigatedTo函數(shù)實(shí)現(xiàn)獲取傳遞過(guò)來(lái)的參數(shù)并在其中的一個(gè)TextBlock中顯示出來(lái)。
所以實(shí)現(xiàn)第一個(gè)傳值要求的方法很簡(jiǎn)單,只要通過(guò)給NavigationService的目標(biāo)頁(yè)面地址附帶上參數(shù)再由目標(biāo)頁(yè)面獲取參數(shù)即可,而我們要注意的地方是,由于移動(dòng)設(shè)備設(shè)計(jì)的便捷性要求,我們應(yīng)該避免那些很復(fù)雜的傳遞參數(shù)的設(shè)計(jì),并且,在設(shè)計(jì)時(shí)要注意Windows Phone設(shè)計(jì)中的墓碑機(jī)制,才能設(shè)計(jì)出合理高效的WP應(yīng)用。
接著我們來(lái)考慮第二個(gè)問(wèn)題,如何在頁(yè)面間共享,傳遞數(shù)據(jù)。我們可以考慮到如果有一個(gè)是中間的“容器”可以存放一些公共的數(shù)據(jù)的話那且不是可以實(shí)現(xiàn)這個(gè)要求 了嗎?這時(shí)如果熟悉Silverlight設(shè)計(jì)的話頭腦里就會(huì)呈現(xiàn)出App這個(gè)類,由于所有的頁(yè)面都可以訪問(wèn)到App這個(gè)類,所以我們可以把一些準(zhǔn)備共享 的數(shù)據(jù)放在App這個(gè)類中定義。就在上面那個(gè)例子中,我們?cè)贏pp類中增加一個(gè)公共變量:
- public string SharedString {set;get; }
這時(shí)如果想在MainPage中給SecondPage傳遞參數(shù)的話則需要先訪問(wèn)那個(gè)共享數(shù)據(jù),這時(shí)的MainPage中的后臺(tái)代碼如下:
- private void TextBlock_ManipulationStarted(object sender, ManipulationStartedEventArgs args)
- {
- (Application.Currentas App).SharedString ="Hello World";
- this.NavigationService.Navigate(new Uri("/SecondPage.xaml", UriKind.Relative));
- args.Complete();
- }
即在訪問(wèn)SecondPage前先修改那個(gè)共享數(shù)據(jù)的值,然后在SecondPage的OnNavigatedTo事件中代碼修改如下:
- protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs args)
- {
- string sharedString = (Application.Currentas App).SharedString;
- txtblk.Text = sharedString;
- base.OnNavigatedTo(args);
- }
同理,如果想通過(guò)SecondPage向MainPage傳遞數(shù)據(jù)的話,只要在調(diào)用GoBack函數(shù)前修改那個(gè)共享數(shù)據(jù)的值再由MainPage中的OnNavigatedTo函數(shù)來(lái)獲取到相對(duì)應(yīng)的數(shù)據(jù)即可。
到這里我們已經(jīng)基本可以實(shí)現(xiàn)上面的兩個(gè)要求了,但第二種方法只是一種取巧的方法,在邏輯及實(shí)現(xiàn)上都有不合理的地方,我們應(yīng)該走思考另外一種更為合理與通用 的實(shí)現(xiàn)方式,那就是OnNavigatedFrom這個(gè)函數(shù)了。大家可能會(huì)想,from不是很明顯嗎,我們就是通過(guò)from的原頁(yè)面跳到目標(biāo)頁(yè)面的,那么 這個(gè)from有何用處呢。其實(shí)它的用處挺大的,例如,通過(guò)這個(gè)函數(shù)我們可以很好的解決上面提到的問(wèn)題。
最后用一個(gè)例子去說(shuō)明這種方式的具體實(shí)現(xiàn),我們定義兩個(gè)頁(yè)面,和之前的類似,這次我們通過(guò)SecondPage返回的值去定義MainPage頁(yè)面的顏色,MainPage的后臺(tái)代碼定義如下:
- public partial class MainPage : PhoneApplicationPage
- {
- public MainPage()
- {
- InitializeComponent();
- }
- public Color? ReturnedColor {set;get; }
- private void TextBlock_ManipulationStarted(object sender, ManipulationStartedEventArgs args)
- {
- this.NavigationService.Navigate(new Uri("/SecondPage.xaml", UriKind.Relative));
- args.Complete();
- args.Handled =true;
- }
- }
這里定義為Color?,因?yàn)榉祷氐闹涤锌赡苁欠穷伾?。而SecondPage中的后臺(tái)代碼定義如下:
View Code
我們通過(guò)獲得一個(gè)隨機(jī)數(shù)值組合而成的顏色設(shè)置為SecondPage的背景顏色,然后通過(guò)OnNavigatedFrom設(shè)置ReturnedColor 為當(dāng)前背景顏色,所以為了獲取SecondPage返回的ReturnedColor,在MainPage的后臺(tái)代碼中還需要重載 OnNavigatedTo方法響應(yīng)這個(gè)OnNavigatedFrom:
- protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs args)
- {
- if (ReturnedColor !=null)
- ContentPanel.Background =
- new SolidColorBrush(ReturnedColor.Value);
- base.OnNavigatedTo(args);
- }
通過(guò)OnNavigatedFrom與OnNavigatedTo,我們就完成了數(shù)據(jù)的傳遞過(guò)程。