使用Collection将自定义类保存到Isolated Storage

时间:2013-03-22 01:16:25

标签: c# serialization windows-phone-8 observablecollection bitmapimage

我创建了一个名为ImageItem的自定义类,其中包含一个BitmapImage和字符串,用于收集CaptureImageTask的响应。我想将每个图像及其相应路径保存到ObservableCollection,该ObservableCollection<ImageItem>绑定到我视图中的列表框。

截至目前,列表框已正确填充,但我无法将BitmapImage type存储在隔离存储中,我相信由于BitmapImage

我不确定如何修复我的解决方案,以便ObservableCollection将被允许保存到隔离存储中以及BitmapImage中的相应路径。

我相信我已将问题缩小到[DataContract]不是可序列化的类型。我尝试过使用attributes within和'[DataMember] public class ImageItem { public BitmapImage ImageUri { get; set; } public string ImagePath { get; set; } } ImageItem.cs`但没有成功。我从未尝试保存非原型类型。

以下是代码,以及每个文件的一些描述。

  • ImageItem.cs

    Settings
  • Settings.cs

    我正在使用ObservableCollection类来创建自定义类型的public static class Settings { public static readonly Setting<ObservableCollection<ImageItem>> imageList = new Setting<ObservableCollection<ImageItem>>("imageList", new ObservableCollection<ImageItem>()); }

    Setting
  • Setting.cs

    其中public class Setting<T> { string name; T value; T defaultValue; bool hasValue; public Setting(string name, T defaultValue) { this.name = name; this.defaultValue = defaultValue; } public T Value { get { //Check for the cached value if (!this.hasValue) { //Try to get the value from Isolated Storage if (!IsolatedStorageSettings.ApplicationSettings.TryGetValue(this.name, out this.value)) { //It hasn't been set yet this.value = this.defaultValue; IsolatedStorageSettings.ApplicationSettings[this.name] = this.value; } this.hasValue = true; } return this.value; } set { //Save the value to Isolated Storage IsolatedStorageSettings.ApplicationSettings[this.name] = value; this.value = value; this.hasValue = true; } } public T DefaultValue { get { return this.defaultValue; } } // Clear cached value public void ForceRefresh() { this.hasValue = false; } } 是一个读取数据并将数据保存到隔离存储的类

    CameraCaptureTask
  • MainPage.xaml.cs中

    从这里开始,我只是想保存ObservableCollection的结果,用于填充void cameraCaptureTask_Completed(object sender, PhotoResult e) { if (e.TaskResult == TaskResult.OK) { //values declared earlier imgChosenPhotoFilePath = null; bmp = new BitmapImage(); imgChosenPhotoFilePath = e.OriginalFileName; bmp.SetSource(e.ChosenPhoto); imgChosenPhoto.Source = bmp; //Add photo to listbox and observablecollection AddToImgList(imgChosenPhotoFilePath, bmp); } } private void AddToImgList(string filePath, BitmapImage bitmap) { //save the values to the ObservableCollection Settings.imageList.Value.Add(new ImageItem() { ImagePath = filePath, ImageUri = bitmap }); //populate the listbox in the view named imgList imgList.ItemsSource = Settings.imageList.Value; } 和列表框

    {{1}}

1 个答案:

答案 0 :(得分:0)

正如您所发现的,您无法序列化BitmapImage。最简单的替代方法是将其保存为单独的文件,然后将文件名保存在要序列化的集合中。

显然,在反序列化时,您需要从磁盘读取文件并将其加载回BitmapImage。

如果您在应用程序的整个生命周期中持久保存此数据,则可能更容易将图像直接保存到IsolatedStorage并保留视图模型中的路径。然后,您可以将路径绑定到ListBoxItemTemplate中的Image。