本篇博文主要阐述基于Windows Runtime的Windows Phone 应用页面间导航相关知识,主要分为如下几个方面: windows
Window、Frame和Page概览 浏览器
基于WinRT的Windows Phone 8.1,每一个App只有一个Window。 缓存
每一个Window都有本身的Frame和导航栈, 以及本身的Page。 app
Window中有一个Frame,而且100%撑满可视区域,一般Frame也是100%撑满Window的可视区域。 框架
全部的Page都被包含在Frame中,Frame负责页面间的导航。Page中包含的就是本身的内容了,包括Xaml文件和相关联的code-behind代码。 函数
虽然应用的窗口通常都只会包含一个Frame,可是咱们能够经过在Page中嵌入Frame,可是这种状况在手机应用上并不常见。 ui
一般Frame在应用启动时建立,能够参考下面代码: spa
来简单分析一下上述代码,OnLaunched函数存在于App.xaml.cs文件中,包含一些启动的逻辑代码。OnLaunched函数中将Frame对象当前Window中,而后调用Frame.Navigate(Type,object)函数,建立一个Page的实例,并把Page放进Frame中。当向前或向后跳转Page时,Frame会记录跳转的历史,能够经过Frame.BackStack属性(返回类型:IList<PageStackEntry>)查看跳转导航的历史。 3d
页面间实现跳转 code
当须要跳转到另外一个页面时,调用Frame的Navigate函数。该函数把当前页面放到后退栈中,而且能够传递任何参数给新的页面。
另外咱们能够在页面中放置Buttons, hyperlinks, appbar buttons 或者其余控件,经过代码移除当前Page,让用户跳转回到以前的页面。咱们能够利用Frame.GoBack()函数实现。
下面来分析具体实现的原理:一般Windows Phone应用会维护一个跳转的历史栈,就像Web浏览器同样。应用一般启动至MainPage.xaml,因此它是栈的第一个项,当跳转到SecondPage.xaml后,SecondPage.xaml就被放进栈中,当调用Frame.GoBack时,SecondPage就会被从栈中弹出来,而后回到MainPage。
处理物理后退键
基于Silverlight的Windows Phone 用户体验中一个典型的特性是:当用户按下Back键时,用户知道这样会取消当前视图并回到以前的视图。在Windows Phone Silverlight中,物理Back键会引发App内部的向回跳转。若是用户当前在启动页面,基于Silverlight框架的Windows Phone App会被关闭。
而在基于Windows Runtime的Windows Phone App中,行为稍微有点不同,默认状况下按下物理Back键会引发向后跳转到以前的App,而跟用户当前在哪一个App的页面上没有关系。所以开发者须要重写这种默认的行为让它在App内部跳转。另外,若是用户在App的启动页面,按下物理Back键会引发跳转到以前的App,可是与Silverlight框架不一样的是当前的App是被挂起,而不是被关闭。
关于上述的内容,那么咱们该如何对Back键进行处理呢?
若是使用空项目模板,那么新建的项目文件中没有任何Back键的处理代码,若是想实现简单的后退跳转,能够利用下面代码。
上述代码中,在App.xaml.cs文件中重写了BackPressed事件,在BackPressed事件中判断是否能够向前进行跳转,若是能够,返回到前一个页面。
若是使用非空项目模板进行建立项目(例如:Hub App或者Pivot App),新建的项目以及包含了正确的Back键处理,咱们能够在项目的Common文件夹中的NavigationHelper类中找到相应处理函数。
另外也能够在某一个页面上单独处理Back键,具体处理方法和上述代码相似,这里就再也不累赘重述了。
页面的缓存
首先咱们来描述一个经常使用场景:当用户第一次访问某个页面时,页面是新的,没有数据带入。用户与页面交互,会填充一些数据。当向前导航到另外一个页面而后再导航回来。一般用户指望页面和离开时是同样的状态。那么咱们该如何保证页面和离开时是同样的状态呢?
咱们能够利用Page的NavigationCacheMode属性。
当使用NavigationCacheMode.Disabled时,向前跳转时建立一个新的实例,原始页面的状态丢失。
当使用NavigationCacheMode.Enabled或Required时,缓存的页面能够重用,原始页面的状态保留。
下面详细描述一下NavigationCacheMode属性三个值的做用:
另外也可使用NavigationHelper类保存/恢复页面状态。一般咱们在Page的OnNavigatedTo函数事件中调用NavigationHelper的LoadState函数恢复页面状态,在Page的OnNavigatedFrom函数事件中调用NavigationHelper的SaveState函数保存页面状态。
参考文章