カスタム タイプの ObservableCollection を wp8 アプリケーションの分離ストレージに保存しようとしています。観察可能なコレクションは、タイプ BitmapImage および文字列の値を保持します。これの目的は、CameraCaptureTask の結果から画像とそれぞれの名前を保存することです。
void cameraCaptureTask_Completed(object sender, PhotoResult e)
{
if (e.TaskResult == TaskResult.OK)
{
//clear current values if any
imgChosenPhotoFileName = null;
bmp = new BitmapImage();
imgChosenPhotoFileName = e.OriginalFileName;
//Display the photo on the page
bmp.SetSource(e.ChosenPhoto);
imgChosenPhoto.Source = bmp;
//Add photo info to Recent
AddToImgList(imgChosenPhotoFileName, bmp);
}
}
private void AddToImgList(string fileName, BitmapImage bitmap)
{
Settings.imageList.Value.Add(new ImageItem() { ImageName = fileName, ImageUri = bitmap });
//Settings.imageList.Value.Add(bitmap);
//populate the List with the saved imageList
imgList.ItemsSource = Settings.imageList.Value;
}
ここで、Settings は、imageList という名前の監視可能なコレクションを保持するために宣言したクラスであり、imgList は、監視可能なコレクションがバインドされる Listbox です。
Settings.cs
public static class Settings
{
public static readonly Setting<ObservableCollection<ImageItem>> imageList = new Setting<ObservableCollection<ImageItem>>("imageList", new ObservableCollection<ImageItem>());
}
設定は、分離ストレージからデータを保存およびロードするクラスです。
設定.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;
}
}
さらに、監視可能なコレクションは次のような ImageItem 型です。
ImageItem.cs
public class ImageItem
{
public BitmapImage ImageUri
{
get;
set;
}
public string ImageName
{
get;
set;
}
}
何らかの理由で、アプリケーションの実行中に画像が imageList コレクションに保存され、imgList Listbox に入力されますが、アプリを閉じて再起動すると、observablecollection は空になりますか? BitmapImage が問題だと思います (シリアル化されていませんか?)、監視可能なコレクションを取得して CameraCaptureTask から画像を保存できませんか?