Windows Phone编程中页面间传值方法

移动开发
实现第一个传值要求的方法很简单,只要通过给NavigationService的目标页面地址附带上参数再由目标页面获取参数即可,而我们要注意的地方是,由于移动设备设计的便捷性要求,我们应该避免那些很复杂的传递参数的设计,并且,在设计时要注意Windows Phone设计中的墓碑机制,才能设计出合理高效的WP应用。

WP开发过程中有时会遇到页面间转值的需求,如果定义两个页面,一个是初始页面Source Page,另外一个是跳转的页面Destination Page,简单地分析主要有两个方面的要求:

  • 首先是在source page跳转到destination page时给destination page页面传值的实现;
  • 然后是当在destination page中调用goback函数回到source page时如何在source page传值;

第一点系统本身提供了基本的实现方法,新建一个项目DataPassingDemo,然后新建一个页面SecondPage.xaml,我们需要实现就是 从MainPage中跳转到SecondPage中去,并传递参数让SecendPage捕捉。首先在Mainpage中增加一个Textblock并且 增加事件处理函数:

  1. <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">            
  2.     <TextBlock Text="Navigate to 2nd page with data" HorizontalAlignment="Center" 
  3.     VerticalAlignment="Center" Padding="0 34"               
  4.          ManipulationStarted="TextBlock_ManipulationStarted"/>        
  5. </Grid> 

在Mainpage的后台代码中,实现TextBlock_ManipulationStarted方法如下:

  1. private void TextBlock_ManipulationStarted(object sender, ManipulationStartedEventArgs args) 
  2. {            
  3.     string destination ="/SecondPage.xaml?parameter1=hello&parameter2=world"
  4.          this.NavigationService.Navigate(new Uri(destination, UriKind.Relative));            
  5.     args.Complete();            
  6.     args.Handled =true;        

可以看到上面的那个destination是不是很像网页间传递参数的形式呢?同理在SecondPage中增加一个Textblock,并给该 Textblock的ManipulationStarted事件中增加Goback()事件。同时,为了捕捉MainPage传递过来的参数,在 SecondPage的后台代码中实现下面的代码:

  1. protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs args) 
  2.         { 
  3.             IDictionary<string,string> parameters =this.NavigationContext.QueryString; 
  4.             if (parameters.ContainsKey("parameter1")) 
  5.             { 
  6.                 string parameter1 = parameters["parameter1"]; 
  7.                 string parameter2 = parameters["parameter2"]; 
  8.                 txtblk.Text = String.Format("Parameter1 is:{0} and parameter2 is:{1}", parameter1, parameter2); 
  9.             } 
  10.             base.OnNavigatedTo(args); 
  11.         } 

通过重载OnNavigatedTo函数实现获取传递过来的参数并在其中的一个TextBlock中显示出来。

所以实现第一个传值要求的方法很简单,只要通过给NavigationService的目标页面地址附带上参数再由目标页面获取参数即可,而我们要注意的地方是,由于移动设备设计的便捷性要求,我们应该避免那些很复杂的传递参数的设计,并且,在设计时要注意Windows Phone设计中的墓碑机制,才能设计出合理高效的WP应用。

接着我们来考虑第二个问题,如何在页面间共享,传递数据。我们可以考虑到如果有一个是中间的“容器”可以存放一些公共的数据的话那且不是可以实现这个要求 了吗?这时如果熟悉Silverlight设计的话头脑里就会呈现出App这个类,由于所有的页面都可以访问到App这个类,所以我们可以把一些准备共享 的数据放在App这个类中定义。就在上面那个例子中,我们在App类中增加一个公共变量:

  1. public string SharedString {set;get; }  

这时如果想在MainPage中给SecondPage传递参数的话则需要先访问那个共享数据,这时的MainPage中的后台代码如下:

  1. private void TextBlock_ManipulationStarted(object sender, ManipulationStartedEventArgs args) 
  2.     (Application.Currentas App).SharedString ="Hello World"
  3.     this.NavigationService.Navigate(new Uri("/SecondPage.xaml", UriKind.Relative)); 
  4.     args.Complete(); 

即在访问SecondPage前先修改那个共享数据的值,然后在SecondPage的OnNavigatedTo事件中代码修改如下:

  1. protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs args) 
  2.     string sharedString = (Application.Currentas App).SharedString; 
  3.     txtblk.Text = sharedString; 
  4.     base.OnNavigatedTo(args); 

同理,如果想通过SecondPage向MainPage传递数据的话,只要在调用GoBack函数前修改那个共享数据的值再由MainPage中的OnNavigatedTo函数来获取到相对应的数据即可。

到这里我们已经基本可以实现上面的两个要求了,但第二种方法只是一种取巧的方法,在逻辑及实现上都有不合理的地方,我们应该走思考另外一种更为合理与通用 的实现方式,那就是OnNavigatedFrom这个函数了。大家可能会想,from不是很明显吗,我们就是通过from的原页面跳到目标页面的,那么 这个from有何用处呢。其实它的用处挺大的,例如,通过这个函数我们可以很好的解决上面提到的问题。

最后用一个例子去说明这种方式的具体实现,我们定义两个页面,和之前的类似,这次我们通过SecondPage返回的值去定义MainPage页面的颜色,MainPage的后台代码定义如下:

  1. public partial class MainPage : PhoneApplicationPage 
  2.     { 
  3.         public MainPage() 
  4.         { 
  5.             InitializeComponent(); 
  6.         } 
  7.         public Color? ReturnedColor {set;get; } 
  8.         private void TextBlock_ManipulationStarted(object sender, ManipulationStartedEventArgs args) 
  9.         { 
  10.             this.NavigationService.Navigate(new Uri("/SecondPage.xaml", UriKind.Relative)); 
  11.             args.Complete(); 
  12.             args.Handled =true
  13.         } 
  14.     } 

这里定义为Color?,因为返回的值有可能是非颜色的。而SecondPage中的后台代码定义如下:

View Code

我们通过获得一个随机数值组合而成的颜色设置为SecondPage的背景颜色,然后通过OnNavigatedFrom设置ReturnedColor 为当前背景颜色,所以为了获取SecondPage返回的ReturnedColor,在MainPage的后台代码中还需要重载 OnNavigatedTo方法响应这个OnNavigatedFrom:

  1. protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs args) 
  2.         { 
  3.             if (ReturnedColor !=null
  4.                 ContentPanel.Background = 
  5.                 new SolidColorBrush(ReturnedColor.Value); 
  6.             base.OnNavigatedTo(args); 
  7.         } 

通过OnNavigatedFrom与OnNavigatedTo,我们就完成了数据的传递过程。

责任编辑:闫佳明 来源: oschina
相关推荐

2010-05-11 16:55:12

Windows Pho

2012-06-07 09:33:13

Windows Pho

2010-05-11 16:47:32

Windows Pho

2013-06-03 10:22:41

iOS开发移动开发页面间传值

2009-07-06 10:00:31

JSP页面传值

2012-04-20 12:59:41

Phone

2009-09-04 11:20:47

ASP.NET页面间值

2012-05-21 14:04:46

TegraWindows Pho

2012-06-13 13:46:31

Windows Pho诺基亚地图

2013-04-17 10:54:18

Windows PhoWindows Pho

2011-06-08 10:28:15

ASP.Net

2012-06-29 13:31:56

ServletJSPJava

2009-09-07 03:44:50

C#窗体间传值

2012-08-17 13:44:26

Windows Pho

2009-09-04 16:10:49

JSP页面间传递参数

2010-04-08 17:40:23

Windows Pho

2012-11-27 10:01:04

微软Windows Pho

2011-05-24 09:42:24

Windows PhoMangoWindows Pho

2012-11-27 09:57:49

微软Windows PhoApollo Plus

2012-05-14 21:14:07

Android页面传值
点赞
收藏

51CTO技术栈公众号