序列化
儲存在IsolatedStorageSettings.ApplicationSettings字典中的對象都要能被序列化。所有這些對象都被序列化存放在一個叫做__ApplicationSettings的XML檔案中。如果有對象無法成功地序列化進字典,它也不會報錯,而是不聲不響地失敗。
所有的基礎類型,基礎類型的集合,以及由基礎類型構成的類都可以成功序列化,因此可以認為,沒有什麼是不能序列化的,如果要有意讓某個欄位不進行序列化,則可以加上IgnoreDataMember屬性來排除該欄位。
注意:儘管你可以將指向同一個對象的多個引用序列化,但是還原序列化之後,就不是指向同一個對象了,而是多份拷貝。要妥善處理好這個問題。
從檔案/相機載入圖片
if (age.PhotoFilename != null){ this.BackgroundImage.Source = IsolatedStorageHelper.LoadFile(age.PhotoFilename);}
下面這個函數包含了圖片檔案的擷取、儲存、刪除、解碼等多個功能:
void PictureButton_Click(object sender, EventArgs e){ Microsoft.Phone.Tasks.PhotoChooserTask task = new PhotoChooserTask(); task.ShowCamera = true; task.Completed += delegate(object s, PhotoResult args) { if (args.TaskResult == TaskResult.OK) { string filename = Guid.NewGuid().ToString(); IsolatedStorageHelper.SaveFile(filename, args.ChosenPhoto); Age age = Settings.List.Value[Settings.CurrentAgeIndex.Value]; if (age.PhotoFilename != null) IsolatedStorageHelper.DeleteFile(age.PhotoFilename); age.PhotoFilename = filename; // Seek back to the beginning of the stream args.ChosenPhoto.Seek(0, SeekOrigin.Begin); // Set the background image instantly from the stream // Turn the stream into an ImageSource this.BackgroundImage.Source = PictureDecoder.DecodeJpeg( args.ChosenPhoto, (int)this.ActualWidth, (int)this.ActualHeight); } }; task.Show();}
帶緩衝的圖片檔案操作輔助類
public static class IsolatedStorageHelper{ static Dictionary<string, ImageSource> cache = new Dictionary<string, ImageSource>(); public static void SaveFile(string filename, Stream data) { using (IsolatedStorageFile userStore = IsolatedStorageFile.GetUserStoreForApplication()) using (IsolatedStorageFileStream stream = userStore.CreateFile(filename)) { // Get the bytes from the input stream byte[] bytes = new byte[data.Length]; data.Read(bytes, 0, bytes.Length); // Write the bytes to the new stream stream.Write(bytes, 0, bytes.Length); } } public static ImageSource LoadFile(string filename) { if (cache.ContainsKey(filename)) { return cache[filename]; } using (IsolatedStorageFile userStore = IsolatedStorageFile.GetUserStoreForApplication()) using (IsolatedStorageFileStream stream = userStore.OpenFile(filename, FileMode.Open)) { // Turn the stream into an ImageSource ImageSource source = PictureDecoder.DecodeJpeg(stream); cache[filename] = source; return source; } } public static void DeleteFile(string filename) { using (IsolatedStorageFile userStore = IsolatedStorageFile.GetUserStoreForApplication()) userStore.DeleteFile(filename); }}
PictureDecoder.DecodeJpeg方法執行速度慢,而且必須要UI線程調用,因此會影響使用者體驗,所以這裡用到了cache。
如果有特別多的圖片(不便使用cache)且經常要載入圖片,建議用WriteableBitmap.LoadJpeg方法,因為該方法可以由後台線程調用。
這個類修改一下就是通用的檔案操作輔助類。