使用集合将自定义类保存到隔离存储

本文关键字:保存 隔离 存储 自定义 集合 | 更新日期: 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中的图像。