WP7 应用数据存储Tombstoning(墓碑化)篇

     Windows Phone 可以支持5个墓碑化(Tombstoning)应用程序,第三方开发的应用程序只能使用最后一个墓碑空间,最新的墓碑化应用程序会自动替换前一个程序。我们可以利用墓碑化功能暂时保存应用程序当前状态,如果用户有意或无意触碰了手机Home 按键,并再次点击Back 按键时应用程序会从墓碑化状态激活并返回最后应用程序状态。

     在开发墓碑化应用程序时,我们可以使用两种数据存储方式:应用程序状态(Application State)、页面状态(Page State),这两种方式最大的区别在于数据存储和使用范围不同,应用程序状态通过PhoneApplicationService.State 属性可存储所有应用程序页面的数据,并不局限于某一个页面,不同的页面可以通过PhoneApplicationService.State 来获取相关的数据。页面状态使用PhoneApplicationPage.State 属性针对的是单独页面的数据内容,当用户点击Back 按键返回时,系统将返回用户之前看到的页面信息。需要注意的是这些存储都是暂时性的,如果应用程序需要永久的数据存储,还应当使用独立存储(IsolatedStorage)方式,具体可参考《WP7 应用数据存储IsolatedStorage 篇》。

     下面我们来做一个简单的实例应用,新建一个Windows Phone 项目,加入TextBox 控件。

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <StackPanel Orientation="Vertical">
        <TextBlock Text="Input text here:"/>
        <TextBox x:Name="testTextBox" Height="70"/>
    </StackPanel>
</Grid>

     在存储页面数据时我们需要使用OnNavigatedFromOnNavigatedTo 方法,当用户离开某页面时将会启动该页面的OnNavigatedFrom 方法,当转向某页面时将执行该页面的OnNavigatedTo 方法。在使用上述方法时需要增加System.Windows.Navigation 命名空间。

     首先我们来编写OnNavigatedFrom 方法的内容,当用户离开MainPage 页面后,将testTextBox 中填写的内容保存到textVal 键。此处使用的是PhoneApplicationPage.State 方式进行存储。

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    State["textVal"] = testTextBox.Text;

    base.OnNavigatedFrom(e);
}

     接下来继续编写OnNavigatedTo 方法,当用户点击Back 按键返回MainPage页面,将恢复之前testTextBox 填写的内容。通过State.TryGetValue 方法即可获得之前保存到textVal 键中的值。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    object textObj;
    if (State.TryGetValue("textVal", out textObj))
    {
        testTextBox.Text = textObj.ToString();
    }

    base.OnNavigatedTo(e);
}

     如果这个TextBox 的内容将用于整个应用程序,任何页面都能够访问到这个数据,则需要使用PhoneApplicationService.State 方法。在程序中增加Microsoft.Phone.Shell 命名空间,将程序稍微调整如下。

PhoneApplicationService service = PhoneApplicationService.Current;

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    service.State["textVal"] = testTextBox.Text;

    base.OnNavigatedFrom(e);
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    object textObj;
    if (service.State.TryGetValue("textVal", out textObj))
    {
        testTextBox.Text = textObj.ToString();
    }

    base.OnNavigatedTo(e);
}
   

     如果需要在非MainPage 页面获取textTextBox 内的值,可直接在该页面增加OnNavigatedTo 方法读取textVal 键值。通过以上两种方式就能够将应用程序当前状态进行墓碑化操作,方便使用者恢复程序之前的状态。

效果图

录入文字;点击Home 键转到首页:

T1 T2

点击Back 按键,系统将恢复之前输入的文字:

T3 T4

相关资料

Running your app in the background (tombstoning)

How to: Preserve and Restore Page State for Windows Phone

posted @ 2011-06-13 11:27  Gnie  阅读(3197)  评论(9编辑  收藏  举报
Copyright © 2010 Gnie