1,wp应用程序的生命周期

编写wp程序,首先必须要搞懂程序的生命周期,因为我们需要在这些不同的时间点做一些必要的事情,比如保存和恢复一些数据。下面这几个事件是我们必须关注的。

Applicatoin_Launching:程序启动时触发。

Application_Closing:程序退出时触发。

Application_Activated:程序向前导航,返回到应用程序时触发。或程序被休眠后,再度激活时触发。注意,这个事件触发时,程序是一种恢复,而不是重新打开。

Application_Deactivated:当从本页面导航到其它页面时,或是按下了主菜单键时触发。代表本页面处于不活动状态,但是程序并没有退出。

2,页面导航

  • 使用HyperlinkButton控件进行导航。通过设定HyperlinkButton的NavigateUri属性,就可以迁移到相关的页面,注意URI必须以左斜杠(/)开始。
<HyperlinkButton Content="我的音乐" NavigateUri="/Music.xaml/>
  • 通过后台代码进行导航。所有的页面都继承自Page类,这个类有一个NavigationService成员用于页面之间的导航,我们可以在页面添加一个按钮,在点击事件中手写代码进行导航。
private void Button_Click(object sender, RoutedEventArgs e)
{
this.NavigationService.Navigate(new Uri("/Sub/Photo.xaml", UriKind.Relative));
}

3,页面导航事件

与页面导航相关的事件有3个,OnNavigatedFrom,OnNavigatedTo,OnNavigatingFrom,它们都是Page的受保护方法,我们可以在自己的页面重写这几个方法。OnNavigatingFrom和OnNavigatedFrom分别是在离开本页面前和离开本页面后触发,OnNavigatedTo是其他页面迁移到本页面时,本页面的OnNavigatedTo方法会被执行。比如有一个Main主页面和一个Sub子页面,主页面迁移到子页面时事件的触发顺序是这样的:

OnNavigatingFrom(Main)—>OnNavigatedFrom(Main)—>OnNavigatedTo(Sub)

4,页面间数据传递

前面已经讲过页面之间如何迁移,如果迁移时要传一些数据过来,应该如何处理呢?wp8中采用的是类似于Web页面的Get传值方式,在URL字符串后面添加?key1=value1&key2=value2的方式,采用键值对的方式,多个键值对之间用&进行分割。在迁移页面的OnNavigatedTo方法中,我们可以通过Page的NavigationContext.QueryString得到这些值。

比如我们对主页面的HyperLinkButton稍作修改:

<HyperlinkButton Content="我的音乐"  NavigateUri="/Music.xaml?id=100&amp;type=2"/>

注意:在xaml中&符号必须要转义为&amp;,若是在后台代码中则不用转义。

在子页面的OnNavigatedTo方法中就可以得到传过来的值。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
var id = this.NavigationContext.QueryString["id"];
Debug.WriteLine("id=" + id);
base.OnNavigatedTo(e);
}

5,URI映射

URI映射可以简化页面间参数的传递,特别是参数比较多的时候。比如,我们需要迁移到这个页面/Sub/Photo.xaml?type={type}&id={id},我们能不能写成/Sub/{type}/{id}这种形式呢?通过URI映射就可以做到,我们必须在应用程序初始化的时候去定义这一种映射,让系统能够识别翻译这种映射就可以了。App类定义了一个静态的PhoneApplicationFrame变量RootFrame,这个是应用程序的根框架,通过设定RootFrame.UriMapper属性,就可以定义这种映射。因此,具体的做法就是,在App类里添加一个设置映射的方法,并在App的构造方法中调用。

/// <summary>
/// 设置URI映射
/// </summary>
private void SetUriMapping()
{
if (RootFrame != null)
{
UriMapper uriMapper = new UriMapper();
UriMapping uriMapping = new UriMapping();
// 设定匹配的模式
uriMapping.Uri = new Uri("/Sub/{type}/{id}", UriKind.Relative);
// 设定真实的URI
uriMapping.MappedUri = new Uri("/Sub/Photo.xaml?type={type}&id={id}", UriKind.Relative);
uriMapper.UriMappings.Add(uriMapping);
RootFrame.UriMapper = uriMapper;
}
}

在迁移代码中,我们就可以像下面这样写:

private void Button_Click(object sender, RoutedEventArgs e)
{
this.NavigationService.Navigate(new Uri("/Sub/2/100", UriKind.Relative));
}

在子页面中必须用type和id参数名来取得相应的值。

6,导航中的前进,后退

通过手机的回退键,我们可以进行后退操作,我们也可以通过NavigationService的GoBack和GoForward可以进行向后或向前导航。如果没有可导航的页面,调用这两个方法会引发异常,我们可以通过CanGoBack和CanGoforward两个属性来查询是否可以导航。

private void HyperlinkButton_Click(object sender, RoutedEventArgs e)
{
if (this.NavigationService.CanGoBack)
{
this.NavigationService.GoBack();
}
}

对于手机的回退键,我们可以通过代码予以屏蔽,使其不起作用,但一般不建议这么做。通过重写OnBackKeyPress事件,设置e.Cancel=true;

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
base.OnBackKeyPress(e);
e.Cancel = true;
}

当我们前进或后退时,浏览的历史记录被压入了NavigationService的BackStack,这是一个先入后出的栈,我们可以移除这些历史记录,但每次只能移除一条,移除后,再回退的时候就会跳过移除的页面记录。

if (this.NavigationService.CanGoBack)
{
this.NavigationService.RemoveBackEntry();
}

7,保存和恢复应用程序(Application)的状态

如果应用程序是由休眠状态恢复,数据由系统维护,不会丢失。如果应用程序已经被逻辑删除(墓碑状态),则需要手动恢复数据。逻辑删除恢复时Application_Launching事件不会被调用。我们需要在Application_Activated里恢复数据,在Application_Deactivated里保存数据,而数据是保存在 PhoneApplicationService.Current.State这个字典变量里的。

// 停用应用程序(发送到后台)时执行的代码
// 此代码在应用程序关闭时不执行
private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
// 保存应用程序数据
if (!string.IsNullOrEmpty(AppData))
PhoneApplicationService.Current.State["myData"] = AppData;
} // 激活应用程序(置于前台)时执行的代码
// 此代码在首次启动应用程序时不执行
private void Application_Activated(object sender, ActivatedEventArgs e)
{
// 从休眠中恢复,不需要特殊处理
if (e.IsApplicationInstancePreserved)
return; if (PhoneApplicationService.Current.State.ContainsKey("myData"))
AppData = PhoneApplicationService.Current.State["myData"] as string;
}

注意,我们保存的数据必须要支持序列化。通过IsApplicationInstancePreserved可以查看程序是不是从休眠状态恢复。对于墓碑状态的调试,可以设置工程的属性,选中调试--》在调试且停用时执行逻辑删除。

7,保存和恢复页面(Page)的状态

这个应用程序的状态是类似的,只不过作用的范围是本页面。当程序从墓碑状态恢复后,再后退到页面时,由于操作系统不会保留数据状态,所以我们在进行页面导航的时候,应尽可能的保存当前页面的状态数据。在页面的OnNavigatedFrom中保存状态,在OnNavigatedTo中进行恢复。状态数据保存在Page的State变量里。

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
State["Name"] = this.lblName.Text;
base.OnNavigatedFrom(e);
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (isNewPage)
{
this.lblName.Text = State["Name"] as string;
}
base.OnNavigatedTo(e);
}

从墓碑状态恢复时,App和Page的构造函数会被调用,所以我们可以从Page的构造函数是否被调用来判断是否需要恢复数据。

01,WP8开发基础的更多相关文章

  1. 006 01 Android 零基础入门 01 Java基础语法 01 Java初识 06 使用Eclipse开发Java程序

    006 01 Android 零基础入门 01 Java基础语法 01 Java初识 06 使用Eclipse开发Java程序 Eclipse下创建程序 创建程序分为以下几个步骤: 1.首先是创建一个 ...

  2. Web前端开发基础 第一天(Html和CSS)

    学习web前端开发基础技术需要掌握:HTML.CSS.JavaScript语言.下面我们就来了解下这三门技术都是用来实现什么的: 1. HTML是网页内容的载体.内容就是网页制作者放在页面上想要让用户 ...

  3. 01 C语言程序设计--01 C语言基础--第1章 C语言概述&第2章 GCC和GDB

    走进嵌入式开发的世界,企业级项目课程让你达到企业嵌入式应用开发要求.名师在线答疑,解决疑难.科学评测体系,系统评估学习.核心项目实........ 30 门课程 241小时12分钟 824 人学习 学 ...

  4. Python运维开发基础04-语法基础【转】

    上节作业回顾(讲解+温习90分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 仅用列表+循环实现“简单的购物车程 ...

  5. Python运维开发基础01-语法基础【转】

    开篇导语 整个Python运维开发教学采用的是最新的3.5.2版,当遇到2.x和3.x版本的不同点时,会采取演示的方式,让同学们了解. 教学预计分为四大部分,Python开发基础,Python开发进阶 ...

  6. javaScript系列 [01]-javaScript函数基础

    [01]-javaScript函数基础 1.1 函数的创建和结构 函数的定义:函数是JavaScript的基础模块单元,包含一组语句,用于代码复用.信息隐蔽和组合调用. 函数的创建:在javaScri ...

  7. Python运维开发基础01-语法基础

    标签(空格分隔): Mr.chen之Python3.0执教笔记(QQ:215379068) --仅供北大青鸟内部学习交流使用 开发不是看出来的,开发一定是练出来的: 想学好开发,没有捷径可走,只有不断 ...

  8. wpf控件开发基础

    wpf控件开发基础(3) -属性系统(2) http://www.cnblogs.com/Clingingboy/archive/2010/02/01/1661370.html 这个有必要看看 wpf ...

  9. (近万字)一篇文章带你了解HTML5和CSS3开发基础与应用-适合前端面试必备

    作者 | Jeskson 来源 | 达达前端小酒馆 HTML5和CSS3开发基础与应用,详细说明HTML5的新特性和新增加元素,CSS3的新特性,新增加的选择器,新的布局,盒子模型,文本,边框,渐变, ...

随机推荐

  1. 第二篇:呈现内容_第二节:WebControl呈现

    一.WebControl的呈现过程 WebControl派生自Control类,所以WebControl的呈现功能基于Control的呈现逻辑之上,但有了比较大的扩展. 首先,WebControl重写 ...

  2. Apache Hadoop下一代MapReduce框架(YARN)简介 (Apache Hadoop NextGen MapReduce (YARN))

    英文看着头大,先试着翻译一下. E文原文:http://archive.cloudera.com/cdh5/cdh/5/hadoop/hadoop-yarn/hadoop-yarn-site/YARN ...

  3. Processing支持中文显示

    Processing 默认不支持中文,中文显示成框框,我使用的版本是:2.2.1,进行如下设置,并且重启processing就可以支持中文了: 可以看到中文了:

  4. django-mptt 树形结构的实现

    觉得这篇博客可以参考:https://blog.csdn.net/abc_1234d/article/details/78360006

  5. 配置ssh的config文件-为每个ssh连接创建别名

    其实选来选去,还是iterm2就够用了,唯一比较麻烦的就是每次都有输入地址和用户名,其实,可以通过配置文件简写的. 可以在 ~/.ssh/config文件写上配置alias信息,以后ssh的时候根据a ...

  6. jquery 取子节点及当前节点属性值

    分享下jquery取子节点及当前节点属性值的方法. <li class="menulink"><a href="#" rel="ex ...

  7. Atitit 软件体系的进化,是否需要一个处理中心

    Atitit 软件体系的进化,是否需要一个处理中心 1.1. 进化树上是没有主干的..1 1.2. ,软件进化的行为1::主要就是给新的应用编写新的程序.1 1.3. ,软件进化的行为2::软件的维护 ...

  8. 菜鸟调错(二)——EJB3.0部署消息驱动Bean抛javax.naming.NameNotFoundException异常

    在部署EJB的消息驱动Bean时遇到了如下的错误: ERROR [org.jboss.resource.adapter.jms.inflow.JmsActivation] (WorkManager(2 ...

  9. EF事务处理封装公用

    /// <summary> /// EF事务封装 公用类 /// </summary> public class TransactionCommon { DbContextTr ...

  10. Linux系统/boot目录破损无法启动怎么办

    linux系统中的/boot目录存放着系统开机所需要的各种文件,其中包含内核.开机菜单及所需配置文件等等.但是当不小心删除了/boot目录里的某些文件或者干脆整个/boot目录都不见了的情况下,该如何 ...