Windows Phone 7 编成之-页面实例之间保留状态数据

前面章节讲到,每次从MainPage导航到SecondPage, 都会生成一个新的SecondPage实例。这就是为什么每次SecondPage 都是初始化时的状态。

如果我们想让SecondPage能够记住自己页面上一次离开时的颜色,就需要在SecondPage之外寻找可以存储这些状态数据的地方。

第一个可以考虑的地方就是MainPage.

第二个可以考虑的就是(isolated storage)独立存储,它就像常规的磁盘存储区。

我们可以使用在System.IO.IsolatedStorage 命名空间中的类来操作这块区域。WinPhone 7 应用程序只能存取在独立存储区中的文件,而且这个文件必须是自己创建的。通常,独立存储区是应用程序存储自己设置信息的理想之地,它允许应用程序在自己多次执行之间保存数据。

我会随后在后面的章节中展示一些独立存储的例子。

第三个方法就是利用PhoneApplicationService类提供的State属性。

这个类在Microsoft.Phone.Shell 命名空间中。它通常在App.xaml文件中被实例化:

Launching="Application_Launching" Closing="Application_Closing"

Activated="Application_Activated" Deactivated="Application_Deactivated"/>

如上代码,在PhoneApplicationService标签后面,有四个关联了处理函数的事件;这些事件的使用例程在这一章节的后面会提到。

我们可以通过静态的PhoneApplicationService.Current 属性获得已经存在的PhoneApplicationService实例。

在PhoneApplicationService中有一个State属性,它是一个IDictionary 字典类型,让用户保存和恢复数据。 你可以用文本关键字来保存你的对象。但需要注意,这些数据并不是持久保存的,它只在程序此次运行中有效。 Stage属性不适合保存那些需要在同一程序不同执行期间需要保存的状态数据。因此他只适合保存应用程序中的所谓“过渡”数据。

保存到State属性中的对象必须是可序列化的,也就是说它可以被存储到XML,并能从XML中恢复。它必须有一个公共的无参数的构造函数,它所有的公共属性要么可以序列化,要么是有Parse方法的可以从字符串转换到对象的类型。

并非所有对象都是那么容易判断出是否可以序列化。在我刚开始学习使用State属性时,我就尝试过在State字典中存储SolidColorBrush对象。结果程序报出异常说:“类型System.Windows.Media.Transform不能被序列化。”花了好长时间才意识到,Brush类中有一个Transform属性,它是一个不可以序列化的抽象类。 我只好改为存储Color对象。

我们来改一下前面的程序,让SecondPage使用这个Stage属性。这其实跟SilverlightRetainData项目中的一样,唯一不同的就是using Microsoft.Phone.Shell 命名空间和两个重载OnNavigatedFrom, OnNavigatedTo。 请参考下面的代码:

Silverlight Project: SilverlightRetainData File: SecondPage.xaml.cs (excerpt)

protected override void OnNavigatedFrom(NavigationEventArgs args)

{ if (ContentPanel.Background is SolidColorBrush) {

Color clr = (ContentPanel.Background as SolidColorBrush).Color;

if (args.Content is MainPage) (args.Content as MainPage).ReturnedColor = clr;

// Save color

PhoneApplicationService.Current.State["Color"] = clr; }

base.OnNavigatedFrom(args); }

protected override void OnNavigatedTo(NavigationEventArgs args) {

// Retrieve color

if (PhoneApplicationService.Current.State.ContainsKey("Color"))

{ Color clr = (Color)PhoneApplicationService.Current.State["Color"]; ContentPanel.Background = new SolidColorBrush(clr);

}

Base.OnNavigatedTo(args);

}

在OnNavigatedFrom中,如果有一个有效的Color对象 clr,它就会被用“Color”关键字存到State字典中:

PhoneApplicationService.Current.State[“Color”] = clr;

在OnNavigatedTo 中,如果关键字“Color”存在,我们就可以恢复Color对象。 并用这个Color对象创建SolidColorBrush对象。

正如前面所提到的,State字典只适合存储在此次程序运行过程中保存的过渡数据。每次退出程序后,PhoneApplicationService中的State字典连同其他属性,都会被销毁。 如果你需要在程序中存储持久性数据(一个程序多次执行中,都能有效的数据),请使用独立存储。

现在可以试试我们的程序:导航到SecondPage, 随即触控屏幕来改变颜色。现在按下电话的硬件启动按钮。这时你已经离开了SilverlightRetainData程序。从电话的开始屏幕,你可以导航到其他程序,但是如果你想按Phone的返回按钮,从新返回到SilverlightRetainData程序和SecondPage. 颜色信息仍然有效。

现在返回到MainPage.在SecondPage中设置的颜色显示正常。从MainPge,按下电话的硬件启动按钮,退出该程序。导航到其他程序。如果这时你还想回到SilverlightRetainData程序中的MainPage. 瞧,MainPage的颜色信息丢失了! 猜猜到底发生了什么?你应该知道。

你可能感兴趣的:(windows,xml,application,存储,silverlight,phone,电话)