本篇介绍一下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. 解决:jmeter查看结果树的响应数据提示超过最大值Response too large to be displayed

    问题:用jmeter做接口测试时,查看结果树的数据没有显示全,给出下面的错误提示 Response too large to be displayed. Size: 1349830 > Max: ...

  2. [2015hdu多校联赛补题]hdu5301 Buildings

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5301 题目大意:给你一块由1x1方格组成的矩形区域,其中有且仅有一个坏块,现在你要在上面建矩形的房子, ...

  3. Window10+VS2015+DevExpress.net 15.1.7完美破解(图)

    终于找到一个可用的破解工具了,并更新到最新的组件包DevExpressComponents-15.1.7.15288.exe,先看图 破解方法: 先安装DevExpressUniversalTrial ...

  4. mysql远程连接命令(转)

    一.MySQL 连接本地数据库,用户名为"root",密码"123"(注意:"-p"和"123" 之间不能有空格) C: ...

  5. iOS中的上传、下载流程心得

    访问相册 1.  判断资源库是否有效 2.  创建imagePickerController 设置代理 弹出视图控制器 3.  实现协议方法 > iOS10 访问系统相册需要在info.plis ...

  6. git 常用操作

    查看某文件的某些行的变化历史: $ git log --pretty=short -u -L 2003,2005:Executor.cpp http://stackoverflow.com/quest ...

  7. 关于JS 事件冒泡和onclick,click,on()事件触发顺序

    今天在给JQgrid中的标签添加click事件的时候,发现一个问题. JQgrid的table中,点击任何位置,都会勾选点击行的checkbox,而我希望在点击我的标签的时候,不要勾选checkbox ...

  8. alphaBlend

    // Alpha = srcAlpha + dstAlpha - srcAlpha * dstAlpha / 0xFF;// R = (srcR * srcAlpha + dstR * dstAlph ...

  9. Android Studio使用org.apache.http报错

    Android Studio使用org.apache.http报错需要加上这句话:useLibrary 'org.apache.http.legacy'

  10. C#获取程序集自动增加的版本号和编译时间

    1. 首先找到文件AssemblyInfo.cs, 路径如下: 2. 修改版本的格式,修改后,程序每次编译,程序集的版本号都会自增. 修改前: [assembly: AssemblyVersion(& ...