我创建了一个名为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}}
答案 0 :(得分:0)
正如您所发现的,您无法序列化BitmapImage
。最简单的替代方法是将其保存为单独的文件,然后将文件名保存在要序列化的集合中。
显然,在反序列化时,您需要从磁盘读取文件并将其加载回BitmapImage。
如果您在应用程序的整个生命周期中持久保存此数据,则可能更容易将图像直接保存到IsolatedStorage并保留视图模型中的路径。然后,您可以将路径绑定到ListBoxItemTemplate中的Image。