1

カスタム タイプの 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 から画像を保存できませんか?

4

1 に答える 1

0

あなたのコードでは、IsolatedStorageクラスを使用していることがわかりました。私はIsolatedStorageクラスの使用についてはよくわかりませんが、それに変数を割り当てるのではないかと思います。

IsolatedStorageSettings.ApplicationSettings[this.name] = this.value;

値を変数に保存する設定は行いません。私はクイック検索を行い、msdnでsaveメソッドを見つけました。おそらくそれが役立つでしょう。

ただし、質問を絞り込んで、IsolatedStorageSettingsのみを使用してより適切な回答を得ることができます。

于 2013-03-15T02:29:58.000 に答える