Search code examples
c#windows-phone-8bitmapisolatedstoragebitmapimage

IsolatedStorage Not Saving Value


I have a custom class that reads and writes from and to IsolatedStorage. All of my values are being saved and retrieved properly except an image. Here is my setup

Setting.cs

//Encapsulates a key/value pair stored in Isolated Storage ApplicationSettings
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;
    }
}

Settings.cs

//Transparent Background
public static readonly Setting<BitmapImage> TransparentBackground = new Setting<BitmapImage>("TransparentBackground", null);

Here is where I gather the Image using PhotoChooserTask and save the result to IsolatedStorage

Settings.Page.xaml.cs

private void Browse_Click(object sender, RoutedEventArgs e)
    {
        photoChooserTask.Show();
    }

    void photoChooserTask_Completed(object sender, PhotoResult e)
    {
        if (e.TaskResult == TaskResult.OK)
        {
            //Code to display the photo on the page in an image control named TransparentModeViewBoxImage.
            BitmapImage bmp = new BitmapImage();
            bmp.SetSource(e.ChosenPhoto);
            TransparentModeViewBoxImage.Source = Settings.TransparentBackground.Value = bmp;
        }
    }    

In the same app instance, I can set the MainPage background to Settings.TransparentBackground.Value which works great, although when I completely restart the app Settings.TransparentBackground.Value returns to null.

MainPage.xaml.cs

ImageBrush ib = new ImageBrush();

        if(Settings.TransparentBackground.Value == null)
            //Use no background image
        else
            ib.ImageSource = Settings.TransparentBackground.Value;

        LayoutRoot.Background = ib;

Nowhere in the app upon closing to I reset Settings.TransparentBackground.Value to null. I cannot figure out why only this value does not save in IsolatedStorage.


Solution

  • You're trying to store it to IsolatedStorageSettings.ApplicationSettings dictionary. Normally, this is used for smaller pieces of data, and more importantly - data which can be serialized.

    A key-value pair consists of a unique key identifier and an associated data value as found in hash tables.IsolatedStorageSettings is a dictionary class used to save or retrieve data as key/value pairs. You can store any serializable object in this dictionary with a string key.

    Source - Quickstart: Working with settings for Windows Phone 8

    So, you need to store the BitmapImage manually. Refer to many other older questions about storing image to local storage, such as this one.