首页 > 代码库 > 【16.Windows Phone】16.3多页面程序

【16.Windows Phone】16.3多页面程序

1.页面间跳转

  • NavigateUri(页面定向跳转) HyperlinkButton控件可以简单的实现页面之间的相互跳转,只需要指定Uri,就可以在点击后跳转到相应的页面。类似于Web中的超链接。Uri的书写格式与前面的一致(Uri格式易错)。用于在Xaml页面之间做定向跳转。 Uri格式实例:/NavigatingBetweenPages;component/OtherPages/Page1.xaml NavigatingBeteenPage是项目名称,component/后面的是要跳转到的页相对于项目的路径。注意最前面的“/”不可以省略。
  • 我们在写Uri的时候可以省略相对项目根目录之前的字符,功能相同。例如:

    /NavigatingBetweenPages;component/OtherPages/Page1.xaml

    OtherPages/Page1.xaml

  • NavigationService(C#灵活跳转) 当要跳转的页面地址不固定,需要给据不同情况跳转不同页面时,需要在C#中需要使用NavigationService的Navigate()。此方法更加灵活可控。
  • NavigationService(实现常规控件的超链) 除了HeyperlinkButton实现超链接,其他常规的控件只要设定控件的NavigationServiece.Navigate()指定uri也可以是实现跳转。
  • NavigationService 常用成员

GoBack()

后退一步

GoForward()

前进一步

CanGoBack

判断是否可以后退,如果没有之前页面,调用GoBack()会报错

  • 常用页面导航相关事件

OnNavigatedTo

由其他页面导航到当前页面后触发

OnNavigatedFrom

从当前页面导航到其他页面后触发

OnNavigatingFrom

从当前页面导航到其他页面前触发

OnBackKeyPress

用户按下手机上的后退按钮时触发,可以在其事件处理函数中执行e.Cancel =true取消后退

2.页间参数传递

  Windows Phone在页面跳转时进行参数传递的方式与Web非常类似。在跳转的Uri中传递参数即可。在目标页面中获取参数通过NavigationContext.QueryString["id"]方法,与Asp.Net方式类似,但与Asp.Net不同的是,当没有传递参数时获取参数程序会抛出异常,Asp.Net拿到的参数为null而不会报异常。在Windows Phone中我们可以通过TryGetValue()来尝试获取参数。语法如下:

1 string id = "";2 if (NavigationContext.QueryString.TryGetValue("id", out id))3 textBlock1.Text = id;

 

3.页面跳转数据暂存

  当用用户按Back键返回app某个页面并且app没有退出时,页面对象一直存续在手机内存中,并没有销毁,所以用户依然可以看到原来所有的数据状态。用户从当前其他页面导航跳转到当前页面则不同,虽然页面地址相同,但此时系统为我们新创建了一个页面实例,之前页面对象从内存中释放,随之页面上得所有数据丢失,但有时我们需要保存原来原来页面的数据,比如用户注册,用户可能会跳转到一个新页中编辑省市数据等条目比较复杂的信息,完成跳转回注册主页,此时我们就需要在页面跳离注册页时暂存现有表单数据。解决方案是,在跳离包含用户编辑数据的页面之前现场数据到 Windows Phone为我们提供的临时存储区,页面跳回后从临时存储区中取出转台数据恢复现场。具体实现代码如下:

 1  //重写OnNavigatedFrom 2 protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) 3 { 4     phoneAppService.State["myValue"] = textBox1.Text;//记录现场 5     base.OnNavigatedFrom(e);  6 } 7  8 //重写OnNavigatedTo 9 protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)10 {11     if (phoneAppService.State.ContainsKey("myValue")) 12     {13     object someObject;14     if (phoneAppService.State.TryGetValue("myValue", out someObject)) 15             textBox1.Text = someObject.ToString();//恢复现场16      }17     base.OnNavigatedTo(e);18 }19         
  • 触类旁通

页面间跳转要保存现场数据监听的导航相关的事件,与逻辑删除(Tombstonling)处理方式一致,但逻辑删除监听的是控件changed(如,文本框的TextChanged)事件和页面的Loaded事件。因为我们应对的是用户点击Start或者Back的情况,当用户返回页面时,触发Loaded事件,考虑到用户可能随时离开本页,所以我们在用户修改信息的同时监听changed事件将数据同步存储。由此我们认识到,页面的加载(Load)和导航(OnNavigateTo)具有类似的功能,当我们来到一个页面不管是直接加载的页面还是从超链接跳转过来的页面都会触发OnNavigateTo和Loaded事件。它们之间是有严格顺序的,首先触发的是OnNavigateTo事件,然后才触发Loaded事件。

【16.Windows Phone】16.3多页面程序