Возможно ли иметь разные IsolatedStorageSettings.ApplicationSettings? - PullRequest
4 голосов
/ 11 ноября 2011

У меня проблема в том, что кажется, что изменения, которые я делаю в моих ApplicationSettings, не обновляются в моих AudioPlayerAgents ApplicationSettings, которые должны быть одинаковыми?!

Моя программа выглядит так:

В моем файле MainPage.xaml.cs в OnNavigated я создаю два массива аудиофайлов

Audio[] aud = new Audio[2];
Audio[] aud1 = new Audio[2];

aud[0] = new Audio(new Uri("1.mp3", UriKind.Relative), 
                   "Test1", 
                   "Test1",
                   new Uri("Images/Covers/0000000018724345_256x256_large.jpg",                       UriKind.Relative));

aud[1] = new Audio(new Uri("2.mp3", UriKind.Relative), 
                   "Test2", 
                   "Test2",
                   new Uri("Images/Covers/0000000018698018_256x256_large.jpg", UriKind.Relative));

aud1[0] = new Audio(new Uri("3.mp3", UriKind.Relative), 
                   "Test3", 
                   "Test3",
                   new Uri("Images/Covers/0000000018465020_256x256_large.jpg", UriKind.Relative));

 aud1[1] = new Audio(new Uri("http://traffic.libsyn.com/wpradio/WPRadio_29.mp3", UriKind.Absolute),
                   "Episode 29",
                   "Windows Phone Radio",
                   new Uri("Images/Covers/0000000018844939_256x256_large.jpg", UriKind.Relative));

Затем я сохраняю один из этих массивов в ApplicationSettings

IsolatedStorageSettings.ApplicationSettings["tracklist"] = aud;
IsolatedStorageSettings.ApplicationSettings.Save();

Затем я закрываю и запускаю BackgroundAudioPlayer.

BackgroundAudioPlayer.Instance.Close();
BackgroundAudioPlayer.Instance.Play();

В моем AudioPlayer я загружаю ранее сохраненные ApplicationSettings, которые отлично работают.

Audio[] aud;
IsolatedStorageSettings.ApplicationSettings.TryGetValue<Audio[]>("tracklist", out aud);

Но когда я позже захочу заменить ApplicationSettings в моем MainPage.xaml.cs другим массивом

  IsolatedStorageSettings.ApplicationSettings["tracklist"] = aud1;
  IsolatedStorageSettings.ApplicationSettings.Save();

И снова загрузить значения в мой AudioPlayer. В моих ApplicationSettings все еще есть старые значения, и AudioPlayerAgent, и MainPage должны использовать одни и те же ApplicationSettings, верно? Фактически, в первый раз, когда он сохраняется и доступен агенту AudioPlayer, так чего мне не хватает?

Мой класс Audio выглядит следующим образом

[DataContractAttribute] 
public class Audio
{
    [DataMember]
    public Uri TrackUrl { get; set; }

    [DataMember]
    public string Title { get; set; }

    [DataMember]
    public string Artist { get; set; }

    [DataMember]
    public Uri CoverURL { get; set; }

    public Audio(Uri trackUrl, string title, string artist, Uri coverUrl)
    {
        TrackUrl = trackUrl;
        Title = title;
        Artist = artist;
        CoverURL = coverUrl;
    }
} 

Ответы [ 3 ]

1 голос
/ 09 декабря 2013

Я столкнулся с той же проблемой. Мне кажется, что IsolatedStorageSettings вроде бы «кешируются» во что-то статичное. То есть до тех пор, пока не будут запущены как фоновый, так и передний процессы, каждый из них будет использовать собственную версию IsolatedStorageSettings. Углубившись в оригинальный код, я нашел следующее:

public sealed class IsolatedStorageSettings : ...
{
    private static IsolatedStorageSettings s_appSettings;
    ...
    public static IsolatedStorageSettings ApplicationSettings
    {
        get
        {
            if (IsolatedStorageSettings.s_appSettings == null)
            {
                IsolatedStorageSettings.s_appSettings = new IsolatedStorageSettings(false);
            }
            return IsolatedStorageSettings.s_appSettings;
        }
    }
    ...
    private IsolatedStorageSettings(bool useSiteSettings)
    {
        if (useSiteSettings)
        {
            throw new NotSupportedException();
        }
        this._appStore = IsolatedStorageFile.GetUserStoreForApplication();
        this.Reload();
    }

Здесь вы можете видеть, что IsolatedStorageSettings фактически загружаются только один раз за процесс (так как это статическая переменная) в методе Reload. Просматривая код, я не нашел других мест, где вызывается Перезагрузка.

Я могу предложить всем, кто сталкивается с той же проблемой, использовать «собственное» хранилище настроек для обмена динамическими данными между AudioAgent и приложением (как сказал Philiiiiiipp в своем последнем комментарии )

Насколько я знаю, лучше всего использовать свойство AudioTrack.Tag.

1 голос
/ 12 ноября 2011

У меня такое ощущение, что у вас MusicPlayerAgent в другой сборке / dll. Если вы это сделаете, это объяснит проблему, поскольку каждая сборка имеет свое изолированное хранилище. Если они находятся в одной сборке, я понятия не имею, почему это не сработает, так как я делаю это сам почти во всех своих телефонных приложениях, которые у меня есть. Вот лучшее, что я прочитал на изолированном хранилище, которое я читал. Во всяком случае, я надеюсь, что ссылка является хорошим чтением. Ссылка

0 голосов
/ 28 августа 2013

Я не понимаю, как IsolatedStorage мешал работать на телефоне.Одно и то же пространство имен в приложениях для ПК имеет явное свойство Scope, чтобы вы могли по крайней мере указать, есть ли отдельные родительские папки.

Если вы не можете объединить 2 проекта в один, просто загрузив все файлы из одного вс другой стороны, по крайней мере, вы можете добавить класс или метод в один из проектов, который загружает класс из IsolatedStorage и возвращает экземпляр, а затем вызывает его из другого проекта, добавляя ссылку (в папке «Ссылки» в обозревателе решений) на первыйпроект во втором, так что вы можете вызвать его.

...