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的顏色信息丟失了! 猜猜到底發生了什麼?你應該知道。

發佈了25 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章