在 Windows Phone / Silverlight 應用程式中,頁面導航時如何保存暫時性資料(如使用者輸入一半的表單內容)是常見需求。PhoneApplicationService.State 字典提供應用程式層級的暫存機制,在頁面卸載時保存、載入時還原,本文詳細說明實作模式。
public partial class MainPage : PhoneApplicationPage
{
// 取得應用程式服務實例
PhoneApplicationService phoneAppService = PhoneApplicationService.Current;
public MainPage()
{
InitializeComponent();
}
// 頁面導航離開時:保存狀態
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
// 將文字方塊內容存入 State 字典
phoneAppService.State["myValue"] = textBox1.Text;
base.OnNavigatedFrom(e);
}
// 頁面導航進入時:還原狀態
protected override void OnNavigatedTo(NavigationEventArgs e)
{
object savedValue;
// 安全檢查:Key 是否存在 + TryGetValue 雙重保險
if (phoneAppService.State.ContainsKey("myValue"))
{
if (phoneAppService.State.TryGetValue("myValue", out savedValue))
{
textBox1.Text = savedValue?.ToString() ?? "";
}
}
base.OnNavigatedTo(e);
}
}
| 方法/屬性 | 用途 | 備註 |
|---|---|---|
| State["key"] = value | 儲存/更新值 | 值必須可序列化 |
| State.ContainsKey("key") | 檢查鍵是否存在 | 避免 KeyNotFoundException |
| State.TryGetValue("key", out val) | 嘗試取值 | 不拋出例外,回傳 bool 表示成功 |
| State.Remove("key") | 移除指定鍵 | 釋放記憶體 |
| State.Clear() | 清空所有暫存 | 應用程式重置時使用 |
public static class StateExtensions
{
public static T GetValue<T>(this IDictionary state, string key, T defaultValue = default(T))
{
if (state.TryGetValue(key, out object value) && value is T typed)
return typed;
return defaultValue;
}
public static void SetValue<T>(this IDictionary state, string key, T value)
{
state[key] = value;
}
}
// 使用範例
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
PhoneApplicationService.Current.State.SetValue("myValue", textBox1.Text);
base.OnNavigatedFrom(e);
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
textBox1.Text = PhoneApplicationService.Current.State.GetValue("myValue", "");
base.OnNavigatedTo(e);
}
[Serializable]
public class FormState
{
public string Name { get; set; }
public int Age { get; set; }
public DateTime LastModified { get; set; }
public List Tags { get; set; }
}
// 儲存
var form = new FormState { Name = "張三", Age = 25, LastModified = DateTime.Now, Tags = new List { "A", "B" } };
PhoneApplicationService.Current.State["FormData"] = form;
// 還原
if (PhoneApplicationService.Current.State.TryGetValue("FormData", out object obj) && obj is FormState restored)
{
textBoxName.Text = restored.Name;
textBoxAge.Text = restored.Age.ToString();
}
| 機制 | 持久性 | 容量 | 適用場景 |
|---|---|---|---|
| PhoneApplicationService.State | 應用程式存活期間 | 記憶體限制(較小) | 頁面導航暫存、表單草稿 |
| IsolatedStorageSettings | 永久(直到手動刪除) | 較大 | 使用者設定、偏好、Token |
| IsolatedStorageFile | 永久 | 配額限制 | 檔案、資料庫、大量資料 |
| 資料庫 | 永久 | 無上限 | 結構化業務資料 |
[Serializable] 或實作 ISerializable"PageName_PropertyName" 格式避免衝突PhoneApplicationService.State 是 Windows Phone / Silverlight 應用程式頁面間暫時資料傳遞的標準機制。掌握 OnNavigatedFrom 存儲與 OnNavigatedTo 還原的標準模式,搭配 TryGetValue 安全取值與擴充方法封裝,能讓頁面導航體驗更流暢、資料不遺失。記住:它是「暫存」而非「持久化」,重要資料仍需落地到隔離儲存或資料庫。