本篇介绍一下Windows Phone 8.1 中页面导航的实现方式。

大家对Windows Phone 8 中页面导航的实现一定不陌生,我们使用 NavigationService 来实现。具体写法是这样的:

NavigationService.Navigate(new Uri("XAML相对路径", UriKind.RelativeOrAbsolute));

而在导航目标页,我们在 OnNavigatedTo 方法中通过 NavigationContext.QueryString["key"] 来接收页面传递的参数。

当按下回退键时,导航源页面会被从回退栈中取出显示,这样我们就完成了一个完整的页面导航过程。

而在Windows Phone 8.1 中,导航方式有所不同,首先我们需要在导航源页面做如下处理:

Frame.Navigate(typeof(NavigationDemoPage), null);

我们利用到了Page内容控制Frame的Navigate方法,它有两个参数,第一个参数是导航目标页的类型,第二个参数(可选)为页面间传递的参数。

而在目标页,我们通过 NavigationHelper 来完成接受参数和其他处理。当我们在项目中新建一个基本页(BasicPage)时,Common文件夹中会出现NavigationHelper类和其他一些辅助类。

NavigationHelper 有两个很重要的事件 LoadState 和 SaveState,分别用来加载已保存状态和保存当前页的状态。而接收导航参数就会用到LoadState 事件,来看看我们在它的注册方法中的处理:

private void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
{
var param = e.NavigationParameter;
}

与Windows Phone 8中可传递多个字符串参数不同的是,8.1 中导航参数只有一个,而且是object 类型,这也就是说我们可以传递包括字符串在内的很多自定义类型,这在参数传递和使用上无疑方便了很多。

在按下回退键时,页面返回到导航源。而如果我们没有使用NavigationHelper 的话,页面是没有办法正常回退的,这是怎么回事呢,我们来看看NavigationHelper 的构造函数吧:

        public NavigationHelper(Page page)
{
this.Page = page; // 当此页是可视化树的一部分时,进行两个更改:
// 1) 将应用程序视图状态映射到页的可视状态
// 2) Handle hardware navigation requests
this.Page.Loaded += (sender, e) =>
{
#if WINDOWS_PHONE_APP
Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;
#else
// 仅当占用整个窗口时,键盘和鼠标导航才适用
if (this.Page.ActualHeight == Window.Current.Bounds.Height &&
this.Page.ActualWidth == Window.Current.Bounds.Width)
{
// 直接侦听窗口,因此无需焦点
Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated +=
CoreDispatcher_AcceleratorKeyActivated;
Window.Current.CoreWindow.PointerPressed +=
this.CoreWindow_PointerPressed;
}
#endif
}; // 当页不再可见时,撤消相同更改
this.Page.Unloaded += (sender, e) =>
{
#if WINDOWS_PHONE_APP
Windows.Phone.UI.Input.HardwareButtons.BackPressed -= HardwareButtons_BackPressed;
#else
Window.Current.CoreWindow.Dispatcher.AcceleratorKeyActivated -=
CoreDispatcher_AcceleratorKeyActivated;
Window.Current.CoreWindow.PointerPressed -=
this.CoreWindow_PointerPressed;
#endif
};
}

我们看到,这是有一个条件编译符 WINDOWS_PHONE_APP。在使用了NavigationHelper 的Page 中,Loaded 和 UnLoaded 事件处理代码中都加入了Windows.Phone.UI.Input.HardwareButtons.BackPressed 的处理,这就是对硬件回退按钮点击的响应,响应事件如下:

        private void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e)
{
if (this.GoBackCommand.CanExecute(null))
{
e.Handled = true;
this.GoBackCommand.Execute(null);
}
}
        public RelayCommand GoBackCommand
{
get
{
if (_goBackCommand == null)
{
_goBackCommand = new RelayCommand(
() => this.GoBack(),
() => this.CanGoBack());
}
return _goBackCommand;
}
set
{
_goBackCommand = value;
}
}

我们看到,事件的处理中执行了GoBackCommand 来导航到导航历史中的最新项。

最有还有一点要说明,Windows Phone 8.1 中,页面导航回退时,导航源页面会重新Load,对于需要加载数据等的页面,这种重新加载的结果并不是我们想看到的。

这里我们可以使用 NavigationCacheMode 来避免这一现象,我们在页面构造方法中对它进行设置,它是一个枚举类型,有三种枚举值:

  • Disabled 不缓存页面,导航返回时重新加载页面
  • Required 缓存页面,且不考虑缓存大小
  • Enabled 缓存页面,但是当超过缓存大小的限制时,放弃缓存。

好了,到这里我们就把Windows Phone 8.1 中的页面导航相关知识介绍完了,希望对大家有帮助,谢谢。

Windows Phone 8.1 新特性 - 页面导航的更多相关文章

  1. Windows Phone 8.1新特性 - 应用商店启动协议

    Windows Phone 8.1 Preview SDK 发布也有几个月了,之前断断续续也写过几篇 Windows Phone 8.1 新特性的文章,今天给大家介绍一下应用商店启动协议相关的知识. ...

  2. Windows Phone 8.1 新特性 - 控件之列表选择控件

    本篇我们来介绍Windows Phone 8.1 新特性中的列表选择控件. 在Windows Phone 8 时代,大家都会使用 LongListSelector 来实现列表选择控件,对数据进行分组显 ...

  3. iOS开发实用技巧—项目新特性页面的处理

    iOS开发实用技巧篇—项目新特性页面的处理 说明:本文主要说明在项目开发中会涉及到的最最简单的新特性界面(实用UIScrollView展示多张图片的轮播)的处理. 代码示例: 新建一个专门的处理新特性 ...

  4. iOS中的项目新特性页面的处理

    一般项目中都会出现新特性页面,比如第一次使用应用的时候,或者在应用设置里查看新特性的时候会出现. 这里,选择新建一个专门处理项目新特性的控制器,来完成功能. 首先是 NewFeaturesViewCo ...

  5. Windows Phone 8.1 新特性 - 控件之应用程序栏

    2014年4月3日的微软Build 2014 大会上,Windows Phone 8.1 正式发布.相较于Windows Phone 8,不论从用户还是开发者的角度,都产生了很大的变化.接下来我们会用 ...

  6. Windows Phone 8.1SDK新特性预览

    前言    Windows Phone 8.1的预览版将在近期推送,WP 8.1的SDK也已经进入到RC阶段,可以从这里安装.本次更新的SDK被直接集成到了VS2013Update2里面,不再是单独的 ...

  7. Ionic3新特性--页面懒加载1

    Ionic3新的懒加载机制给我带来了如下新特性: 避免在每一个使用到某Page的Module或其他Page中重复的import这个类(需要写一堆路径) 允许我们通过字符串key在任何想使用的地方获取某 ...

  8. Windows Phone8.1系统新特性

    Windows Phone 8.1 beta SDK已经为大家透露了不少WP8.1系统的新特性,不过这些新特性还不能保证在最终的消费者版本中都有所体现,毕竟它还仅是SDK版本.日前,国外媒体WPCen ...

  9. 微软架构师解读Windows Server 2008 R2新特性

    目前众多企业都开始为自己寻找一个更加适合自身发展的服务器操作平台.微软的Windows Server 2008 R2就是可以为大家解决服务器平台问题.微软最新的服务器平台Windows Server ...

随机推荐

  1. 写出易调试的SQL—西科软件

    1.前言 上篇 写出易调试的SQL , 带来了一些讨论, 暴露了不能重用执行计划和sql注入问题, 十分感谢园友们的建议 . 经过调整后 ,将原来的SQLHelper 抓SQL 用做调试环境用, 发布 ...

  2. 转载 --ios 模型-setValuesForKeysWithDictionary

    应用场景:app请求后端数据,返回的数据是JSON形式,如: { "is_favor" = 0; "is_follow" = 0; "is_prais ...

  3. java_js_json_日期格式化

    调用方法: var createBeginTime= createBeginTime.Format("yyyy-MM-dd 00:00:00"); 方法: Date.prototy ...

  4. System.StackOverflowException的一个例子(转)

    今天按着书上的例子写呀写,写了一下午终于做出了一个三层模式的通讯录(当然很简单),但是,弄了最后却碰到个运行时的 异常,弄得我这个asp.net菜鸟郁闷了再郁闷.异常如下:发生类型为 System.S ...

  5. 读取XML 发送网页版邮件

    DataSet ds = new DataSet(); ds.ReadXml(AppDomain.CurrentDomain.BaseDirectory + "XML\\Mail.xml&q ...

  6. js中判断true和false的情况

  7. 【笔记】Android项目添加项目引用方法

    刚才在做phoneGap时,想试图自己添加phoneGap的lib组件(jar的源码),找了好多种方法,下面这种成功了 项目邮件 Properties, Android ,Add...  ,然后Dep ...

  8. Freemarket学习整理。

    导入freemarker.jar包 把word文档另存为xml格式,2007以上版本支持. 编写代码,把路径更改为xml所在路径. 把需要更改的地方写成${}形式. package Document. ...

  9. 在rails中 Rendering Partials through Ajax

    之前做.net的时候,自己做了一个showcontent的插件,用来加载页面的局部partial 之前采用的是ashx的方式 但rails里面不太方面,今天找到一个比较好的方法,试验成功 起初网上找到 ...

  10. 对button或radiobutton制作样式

    制作样式在drawable中进行 (cheakbox)在样式中点击变换图片,<selector> <item android:state_checked="true&quo ...