日期:2014-05-17  浏览次数:20715 次

新时尚Windows8开发(3):应用程序状态

大家可能还记得,在WP开发中,我们曾讨论过应用程序状态。同样地,在Win8开发上,我们还可以适当地使用这玩意儿。上一节中,我们从应用程序周期中了解到,当我们的“板砖”应用程序不在前台运行时,就会被挂起。

而这个挂起行为其实和WP中的差不多,在WP中,其实应用程序的当前状态并不是说每次被放置到后台就会丢失,系统为我们维护五个应用程序的状态,一旦堆放在后台的应用程序数目超过五个,那就对不起了。呵,所以,我们应考虑在适当的时候保存应用程序状态。

在Win8也会类似这样的情况,不过,相对而言,没有WP控制那么严格,除非你手动把应用程序进程给干掉或者应用程序退出。

 

注意哦,咱们这里说的应用程序状态仅仅是在运行时有效,这些数据并不是保存到硬盘或存储设备上,只是存在于内存中,作用是方便我们传递数据罢了。

在过去的WinForm开发或者WPF开发中,我们会考虑使用一个静态类或在某类中声明一些静态字段来保存全局数据,即在声明的时候加上static关键字。

除了这种方法,今天,我们在Win8开发中,不妨用用这个类。

启动VS,打开“对象浏览器”,我们找到CoreApplication类,它位于Windows.ApplicationModel.Core命名空间。看图。

 

我在图上标注了,蓝色那圈圈,看到没?有个静态属性Properties,它其实就是一个字典结构。嗯,字典结构,应该懂了,就是一key一value那种。

现在就好办了,我们今天就是利用它来存储一些运行时信息,你可以把它看成是Asp.Net中的Session。

先简单这个示例是怎么玩的,玩法很简单,玩家一个,就你自己。

我们运行示例后,在第一个页面中分别输入两个值,然后把这两个值保存到CoreApplication.Properties字典中;

第二个页面和第三个页面分别取出这些值并显示出来。

为了能实现在同一个页面中查看多个视图,我在主页面中放一个Frame,再利用这个Frame来显示其它页面。主页的XAML如下。

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ListBox Grid.Column="0"  VerticalAlignment="Stretch" Width="200"
                 FontSize="28"
                 SelectionChanged="ListBox_SelectionChanged"
                 SelectionMode="Single">
            <ListBoxItem>页面一</ListBoxItem>
            <ListBoxItem>页面二</ListBoxItem>
            <ListBoxItem>页面三</ListBoxItem>
        </ListBox>
        <Frame x:Name="myFrame" Grid.Column="1"/>
    </Grid>


后台的C#代码就是根据ListBox中选择的页面来导航。

        private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ListBoxItem item = e.AddedItems[0] as ListBoxItem;
            if (item != null)
            {
                string str = item.Content as string;
                switch (str)
                {
                    case "页面一":
                        myFrame.Navigate(typeof(Page1));
                        break;
                    case "页面二":
                        myFrame.Navigate(typeof(Page2));
                        break;
                    case "页面三":
                        myFrame.Navigate(typeof(Page3));
                        break;
                    default:
                        break;
                }
            }
        }


下面,我们开始做第一个页面,就是用来输入数据并保存状态的。

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        
        <TextBlock Grid.Row="0" Margin="25" Text="第一个页面" Style="{StaticResource HeaderTextStyle}"/>
        
        <StackPanel Margin="15" Grid.Row="1">
            <TextBlock Text="在本页输入两个状态值,第一个状态在页面二中获取;第二个状态值在页面三中获取。" Style="{StaticResource GroupHeaderTextStyle}"/>
            <TextBlock Text="输入第一个状态值:" Margin="0,13,0,0" Style="{StaticResource BodyTextStyle}"/>
            <TextBox Name="txt1" Margin="5,10,0,0"/>
            <TextBlock Text="输入第二个状态值:" Margin="0,18,0,0" Style="{StaticResource BodyTextStyle}"/>
            <TextBox Name="txt2" Margin="5,10,0,0"/&g