win8開發(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"/>
  •         <Button Margin="12,20,0,0" Width="220" Content="保存狀態"
  •  Click="onSave"/>
  •     </StackPanel>
  • </Grid>

    我們要處理保存按鈕的單擊事件。

  • private void onSave(object sender, RoutedEventArgs e)
  • {
  •     if (string.IsNullOrWhiteSpace(txt1.Text)
  •         || string.IsNullOrWhiteSpace(txt2.Text))
  •     {
  •         return;
  •     }
  •     Windows.ApplicationModel.Core.CoreApplication.Properties["value1"] = txt1.Text;
  •     Windows.ApplicationModel.Core.CoreApplication.Properties["value2"] = txt2.Text;
  • }

        

後面兩個頁面幾乎一樣,就是從第一個頁面保存的狀態中讀取。
頁面二-XAML


  • <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
  •     <Grid.RowDefinitions>
  •         <RowDefinition Height="auto"/>
  •         <RowDefinition Height="*"/>
  •     </Grid.RowDefinitions>
  •     <TextBlock Grid.Row="0" Margin="25" Text="第二個頁面" 
  • Style="{StaticResource HeaderTextStyle}"/>
  •     <TextBlock Name="tb" FontSize="32" Margin="20,20,0,0" Grid.Row="1"/>
  • </Grid>

   
頁面二-C#

  • protected override void OnNavigatedTo(NavigationEventArgs e)
  • {
  •     if (Windows.ApplicationModel.Core.CoreApplication.Properties.ContainsKey("value1"))
  •     {
  •         this.tb.Text = Windows.ApplicationModel.Core.CoreApplication.
  • Properties["value1"] as string;
  •     }
  • }

        

頁面三-XAML

  • <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
  •     <Grid.RowDefinitions>
  •         <RowDefinition Height="auto"/>
  •         <RowDefinition Height="*"/>
  •     </Grid.RowDefinitions>
  •     <TextBlock Grid.Row="0" Margin="25" Text="第三個頁面" 
  • Style="{StaticResource HeaderTextStyle}"/>
  •     <TextBlock Name="tb" Grid.Row="1" Margin="20,20,0,0" FontSize="32"/>
  • </Grid>

頁面三-C#


  • protected override void OnNavigatedTo(NavigationEventArgs e)
  • {
  •     if (Windows.ApplicationModel.Core.CoreApplication.Properties.ContainsKey("value2"))
  •     {
  •         this.tb.Text = Windows.ApplicationModel.Core.CoreApplication.
  • Properties["value2"] as string;
  •     }
  • }


  • 運行一下吧。首先,在主頁左邊的列表中選頁面一,輸入兩個數據,記得點保存按鈕。



  • 1.png 
  • 接着分別轉到頁面二和頁面三,看看頁面中顯示了結果沒?



  • 2.png


  • 3.png


  • 這個簡單吧?當然,在測試中我們也發現了,當掛起後再回到程序,文本框中輸入的內容不見了
  • ,但已經保存到CoreApplication.Properties到中的內容仍然可以讀取。

  • 當然了,如果你把應用程序退出了,自然保存的狀態也會丟失。因此,如果在程序掛起後保留文
  • 本框中的數據,各位應該知道怎麼做了。

  • 如果要在程序退出後,在下次運行時還能讀取配置信息,那麼就需要把數據保存到硬盤中了,
  • 這個嘛,下一篇文章再研究吧。


  • 下面我們說說與運行時狀態有關的另一個東東——頁面參數傳遞。

  • 各位一看到這個,一定會想起在WP中的頁面傳參數,而且那時候,我們還說了URI映射,
  • 記得否?忘了也關係,因爲我們今天用不着URI映射。

  • 在Win8“板磚”應用開發中,頁面參數遞參數是通過調用Frame類的Navigate方法,
  • 它有兩個重載,其中一個是可以傳參數的,即

  • public bool Navigate(System.Type sourcePageType, object parameter) 

  • 看這參數是Object類型的,這就讓我們有了很大的發展空,我們可以傳字符串,數值等,
  • 可以想多傳一些數據,可以定義一個類,直接傳遞類實例也行。


  • 廢話少講,我們來做個練習就懂了。
    1、啓動可愛的VS,新項目一個Windows Store應用,就是Win8應用了。
    2、新建項目後,你會看到,默認打開了App.xaml.cs文件。
    3、添加一個類,隨你喜歡,反正有公共屬性就行了。

    • public class Product
    • {
    •     public string ProductName { get; set; }
    •     public string ProductID { get; set; }
    • }
4、新建一個頁面,命名爲PageGet.xaml,名字你喜歡,自己記住就行了。


  • <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
  •     <StackPanel Margin="30">
  •         <TextBlock Text="通過頁面傳遞的參數:" Style="{StaticResource HeaderTextStyle}"/>
  •         <StackPanel Orientation="Horizontal" Margin="5,80,0,10">
  •             <TextBlock Text="產品編號:" FontSize="28"/>
  •             <TextBlock Name="tbProID" FontSize="28"/>
  •         </StackPanel>
  •         <StackPanel Orientation="Horizontal" Margin="5,13,0,0">
  •             <TextBlock Text="產品名稱:" FontSize="28"/>
  •             <TextBlock Name="tbProName" FontSize="28"/>
  •         </StackPanel>
  •     </StackPanel>
  • </Grid>
在XAML文檔中右擊,從菜單中選擇“查看代碼”。


  • protected override void OnNavigatedTo(NavigationEventArgs e)
  • {
  •     // 獲取參數
  •     Product product = e.Parameter as Product;
  •     if (product != null)
  •     {
  •         this.tbProID.Text = product.ProductID;
  •         this.tbProName.Text = product.ProductName;
  •     }
  • }
5、回過頭,打開MainPage.xaml,我們來佈局一下。


  • <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
  •     <StackPanel Margin="30">
  •         <TextBlock Text="輸入產品編號:" Style="{StaticResource SubheaderTextStyle}"/>
  •         <TextBox Name="txtID" Margin="5,10,5,0"/>
  •         <TextBlock Margin="0,20,0,0" Text="輸入產品名稱:" Style="{StaticResource SubheaderTextStyle}"/>
  •         <TextBox Name="txtName" Margin="5,10,5,0"/>
  •         <Button Content="跳轉" Padding="35,10,35,10" Margin="15,20,0,0" Click="onNav"/>
  •     </StackPanel>
  • </Grid>
處理按鈕的單擊事件。


  • private void onNav(object sender, RoutedEventArgs e)
  • {
  •     // 取出當前窗口的根Frame
  •     if (Window.Current.Content is Frame && Window.Current.Content != null)
  •     {
  •         Frame myFrame = Window.Current.Content as Frame;
  •         Product prd = new Product()
  •         {
  •             ProductID = txtID.Text,
  •             ProductName = txtName.Text
  •         };
  •         // 導航到目標頁面並傳遞參數
  •         myFrame.Navigate(typeof(PageGet), prd);
  •     }
  • }
現在,我們運行一下。
5.png 

4.png 



1.png (17.65 KB, 下載次數: 0)

1.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章