注:本文内容面向Runtime App。

在新建项目后,细心观察,你会发现在App类中有以下代码:

                // TODO: 将此值更改为适合您的应用程序的缓存大小
rootFrame.CacheSize = ;

这行代码放在了OnLaunched方法中,CacheSize是Frame类的一个公共属性。

我们知道,Frame类负责完成页面之间的导航,它本身就是一个容器控件。CacheSize属性用于告诉Frame对象,要缓存的页面数量。近日,有人提问说,这个缓存页面数是不是导航记录的数量?

明确地告诉你:非也。

Frame的导航记录在BackStack属性中,这个Cache并不是用来缓存页面的导航记录的,一定要注意啊,不要搞混了

CacheSize属性是用于设置要保留页面实例的个数。当Frame导航到某个页面时,通常情况下,是要调用页面的构造函数来创建某页的新实例的。即,不论你是向前导航还是向后导航,只要导航到某页,某页都会重新实例化。因此,就可以理解为什么Frame类用于导航的Navigate方法要这样定义了:

public bool Navigate(System.Type sourcePageType)

这与Silverlight中的导航不同,SL中是传递URI的,而这里是传递页面类的Type,就因为得到某个页面类的Type,才会在导航是new一个实例出来。

感觉很抽象吗?没事,示例是无敌学习利器,还犹豫什么,动手。

1、启动VS,新建一个”空白应用程序(Windows Phone)“项目。据说MS会统一所有平台的命名,当然这是需要的,也是盖茨的梦想。不管叫什么,系统还是一样的,只是叫法不同罢了。

2、在App类中,找到OnLaunch方法,把CaheSize改为0。

rootFrame.CacheSize = ;

3、把项目默认生成的MainPage.xaml删掉,因为它的存在,严重影响示例的演示,为什么? 待会儿再告诉你。
4、向项目中添加三个空白页,这个会了吧? 不会的话,就按Ctrl + Shift + A,试试。

5、三个页面的结构差不多,所以这里我只说第一个页面。XAML代码如下:

    <Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="页面一" Style="{StaticResource HeaderTextBlockStyle}"/> <StackPanel Grid.Row="1">
<TextBlock Text="页面初始化"
FontSize="45"
Margin="3,10,2,5">
<TextBlock.Foreground>
<SolidColorBrush x:Name="slb" Color="White"/>
</TextBlock.Foreground>
</TextBlock> <Button Content="下一页" Grid.Row="1" Click="OnNext"/>
</StackPanel>
</Grid> <Page.Resources>
<Storyboard x:Key="std" RepeatBehavior="5x">
<ColorAnimation
Duration="0:0:0.5"
Storyboard.TargetName="slb"
Storyboard.TargetProperty="Color"
From="Purple"
To="Yellow"/>
</Storyboard>
</Page.Resources>

在Page的资源列表中,声明了一个Storyboard,用动画来改变显示”页面初始化“的TextBlock的文本颜色。

思路是这样的:在页面类的构造函数中播放该动画,并且动画是重复播放5次的(由RepeatBehavior指定)。如果页面发生了实例化操作,那么构造函数也被调用,动画就会被播放。在页面之间导航时,通过观看页面上的颜色改变动画是否会播放就可以知道构造函数是否被调用,从而了解到页面是否产生了新实例。

6、在页面类的构造函数中,取出资源中的Storyboard对象,然后开始播放动画。

        public Page1 ()
{
this.InitializeComponent();
NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Required; // 如果构造函数被调用,就播放动画
Storyboard std = this.Resources["std"] as Storyboard;
std.Begin();
}

在上面代码中还有这么一句:

NavigationCacheMode = Windows.UI.Xaml.Navigation.NavigationCacheMode.Required;

Page类有个NavigationCacheMode属性,必须将它设置为Enabled或者Required,不要设置为Disabled。因为Disabled表示禁用页面缓存,如果禁用,就算CacheSize设置为100万也没用,页面实例都不会缓存。

那么,Enabled和Required值又有啥区别呢? 区别在于是否强制缓存。如果设置为Enabled并且没有超出CacheSize指定的页面缓存的数目,那么页面实例会被缓存;但是,一旦缓存的页面数量超过了CacheSize指定的数量,哪怕你将页面的缓存模式设置为Enabled,页面实例也不再进行缓存。

而Required则不同,就算已缓存的页面实例的总数已经超过CacheSize的值,设置了Required模式的页面仍然会强制缓存。

不过,要注意一点:无论何时,都不要把CacheSize设置为0,如果为0,就算页面使用了Required模式,都不会发生缓存

也就是说,应该始终让CacheSize的值大于0。

本例有三个页面,就把CacheSize设置为3吧。

       rootFrame.CacheSize = ;

使用页面缓存,可以在应用程序运行过程中,让页面的类实例暂时保存,不需要在每次导航到页面的时候都进行实例化操作,节省性能开销,尤其是当某些页面在初始化时会比较耗时间的时候更有用,只在第一次访问时实例化,后面再次访问时就不再实例化,这样可以提高程序的响应速度。

不管页面实例是否被缓存,当导航进入页面后,OnNavigatedTo方法都会被调用。但是,如果切换到其他应用或者回到开始屏幕而使应用程序挂起(中断运行)后,再次回到应用程序,页面不会发生重新实例化,OnNavigatedTo方法也不会被调用。

应用程序在挂起后会引发App的Suspending事件,当再次回到应用后,会引发App的Resuming事件。

注意这与WP以前的Silverlight框架的应用程序不同,SL页面在离开或回到应用程序,都会触发导航事件,而从RT库移植过来的API与Win 8x应用取得统一,离开或回到当前应用程序不会引发页面的导航事件。

关于本文中提到的示例,下载地址为:http://files.cnblogs.com/tcjiaan/%E9%A1%B5%E9%9D%A2%E7%BC%93%E5%AD%98%E7%A4%BA%E4%BE%8B.rar

【WP开发】正确理解页面缓存的更多相关文章

  1. IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列

    1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...

  2. IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token

    本文引用了简书作者“骑小猪看流星”技术文章“Cookie.Session.Token那点事儿”的部分内容,感谢原作者. 1.前言 众所周之,IM是个典型的快速数据流交换系统,当今主流IM系统(尤其移动 ...

  3. IM开发基础知识补课:正确理解前置HTTP SSO单点登陆接口的原理

    1.前言 一个安全的信息系统,合法身份检查是必须环节.尤其IM这种以“人”为中心的社交体系,身份认证更是必不可少. 一些PC时代小型IM系统中,身份认证可能直接做到长连接中(也就是整个IM系统都是以长 ...

  4. ASP.NET MVC3系列页面缓存、缓存依赖SQL(真实项目注意细节)

    缓存依赖数据库 第一步 1通过vs里面带的命令提示窗口. 2或者.NET Framework 版本 4(64 位系统)条件,%windir%\Microsoft.NET\Framework64\v4. ...

  5. 缓存:前端页面缓存、服务器缓存(依赖SQL)MVC3

    缓存依赖数据库 第一步 1通过vs里面带的命令提示窗口. 2或者.NET Framework 版本 4(64 位系统)条件,%windir%\Microsoft.NET\Framework64\v4. ...

  6. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...

  7. Js位置与大小(1)——正确理解和运用与尺寸大小相关的DOM属性

    在web开发中,不可避免遇到要计算元素大小以及位置的问题,解决这类问题的方法是利用DOM提供的一些API结合兼容性处理来,所有内容大概分3篇左右的文章的来说明.本文作为第一篇,介绍DOM提供的与尺寸大 ...

  8. Nginx反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统 ...

  9. Nginx 反向代理、负载均衡、页面缓存、URL重写、读写分离及简单双机热备详解

    大纲 一.前言 二.环境准备 三.安装与配置Nginx  (windows下nginx安装.配置与使用) 四.Nginx之反向代理 五.Nginx之负载均衡  (负载均衡算法:nginx负载算法 up ...

随机推荐

  1. 我对C#的理解

    C#里面所有东西都可以看作对象.接口,类,枚举等等. 类是最常用的,可以继承别的接口,类等,就会自动拥有别人的功能. 接口是类的概要.给别人看的协议,好像一个人对外做出的承诺. 抽象类是实现了部分承诺 ...

  2. hdu 3065 AC自动机

    // hdu 3065 AC自动机 // // 题目大意: // // 给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次 // // 解题思路: // // AC自动机,插入,构建, ...

  3. cowboy学习笔记(安装与部署)

    安装cowboy,参照官方文档:http://ninenines.eu/docs/en/cowboy/1.0/guide/getting_started/ 添加依赖库:在makefile中添加,会自动 ...

  4. 00.PHP学习建议

    各位师弟师妹,大家好~PHP不是我们专业的本该有的方向.我不知道大家为什么来学习这门语言,也许是自己了解之后喜欢这门语言(我想这种可能在我们专业是挺少的),也许是听守中哥说这门语言简单好学,为了躲避学 ...

  5. [Laravel-Swagger]如何在 Laravel 项目中使用 Swagger

    如何在 Laravel 项目中使用 Swagger http://swagger.io/getting-started/ 安装依赖 swagger-php composer require zirco ...

  6. 使用Vs2012开发Metro时在另一台win8平板上调试的步骤

    需求:开发一个metro应用,因为要给平面设计师参谋, 需要将软件安装在win8平板上. 环境:开发机是win8,  win8平板是win8.1rtm , 是用老的win7平板改装的. 步骤: 1:拷 ...

  7. nginx.conf各参数的意义

    搬运+翻译至 http://qiita.com/syou007/items/3e2d410bbe65a364b603 /etc/nginx/nginx.conf 记录各个参数的意义 user user ...

  8. 高性能网站架构设计之缓存篇(4)- Redis 主从复制

    Redis 的主从复制配置非常容易,但我们先来了解一下它的一些特性. redis 使用异步复制.从 redis 2.8 开始,slave 也会周期性的告诉 master 现在的数据量.可能只是个机制, ...

  9. 你以为的ASP.NET文件上传大小限制是你以为的吗

    我们以为的文件大小限制 我们大家都知道ASP.NET为我们提供了文件上传服务器控件FileUpload,默认情况下可上传的最大文件为4M,如果要改变可上传文件大小限制,那么我们可以在web.confi ...

  10. 《你必须知道的.NET》读书笔记一:小OO有大智慧

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.对象  (1)出生:系统首先会在内存中分配一定的存储空间,然后初始化其附加成员,调用构造函数执行初 ...