使用集合将自定义类保存到隔离存储
本文关键字:保存 隔离 存储 自定义 集合 | 更新日期: 2023-09-27 18:05:07
我已经创建了一个名为ImageItem
的自定义类,它包含一个BitmapImage和字符串来收集CaptureImageTask
的响应。我想将每个图像及其各自的路径保存到我视图中绑定到列表框的ObservableCollection
。
到目前为止,列表框正确填充,但是我在隔离存储中存储ObservableCollection<ImageItem>
时遇到了麻烦,我相信是因为BitmapImage type
。
我不确定如何修复我的解决方案,以便BitmapImage
将被允许保存到隔离的存储以及ObservableCollection
内的相应路径。
我相信我已经把问题缩小到BitmapImage
不是一个可序列化的类型。我尝试使用[DataContract]
和'[DataMember] attributes within
ImageItem.cs '没有成功。我从未尝试过保存非基本类型。
下面是代码,每个文件的一些描述。
-
ImageItem.cs
public class ImageItem { public BitmapImage ImageUri { get; set; } public string ImagePath { get; set; } }
-
Settings.cs
我使用
Settings
类来创建自定义类型的ObservableCollection
。public static class Settings { public static readonly Setting<ObservableCollection<ImageItem>> imageList = new Setting<ObservableCollection<ImageItem>>("imageList", new ObservableCollection<ImageItem>()); }
-
Setting.cs
其中
Setting
是读取并保存数据到隔离存储的类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; } }
-
MainPage.xaml.cs
从这里我只是试图保存
CameraCaptureTask
的结果,这是用来填充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; }
正如您所发现的,您无法序列化BitmapImage
。最简单的替代方法是将其保存为一个单独的文件,然后将文件的名称保存在要序列化的集合中。
显然,在反序列化时,您需要从磁盘读取文件并将其加载回BitmapImage。
如果你要在应用的整个生命周期中持久化这些数据,那么直接将图像保存到IsolatedStorage并在视图模型中保留路径可能会更容易。然后,您可以将路径绑定到ListBoxItemTemplate中的图像。