Можно ли иметь разные IsolatedStorageSettings.ApplicationSettings?
У меня проблема в том, что кажется, что изменения, которые я делаю в моих ApplicationSettings, не обновляются в моих AudioPlayerAgents ApplicationSettings, которые должны быть такими же?!
Моя программа выглядит так:
В моем MainPage.xaml.cs в OnNavigatedTo я создаю два массива аудио файлов
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, верно? Фактически, в первый раз, когда он сохраняется и доступен для AudioPlayerAgent, чего мне не хватает?
Мой Аудио класс выглядит так
[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 ответа
У меня такое ощущение, что у вас MusicPlayerAgent в другой сборке /dll. Если вы это сделаете, это объяснит проблему, поскольку каждая сборка имеет свое изолированное хранилище. Если они находятся в одной сборке, я понятия не имею, почему это не сработает, так как я делаю это сам почти во всех моих телефонных приложениях, которые у меня есть. Вот лучшее, что я прочитал на изолированном хранилище, которое я читал. Во всяком случае, я надеюсь, что ссылка является хорошим чтением. Ссылка на сайт
Я столкнулся с той же проблемой. Мне кажется, что 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.
Я не понимаю, как IsolatedStorage мешал работать на телефоне. Одно и то же пространство имен в приложениях для ПК имеет явное свойство Scope, чтобы вы могли хотя бы определить, существуют ли отдельные родительские папки.
Если вы не можете объединить 2 проекта в один, просто загрузив все файлы из одного в другой, по крайней мере, вы можете добавить класс или метод в один из проектов, который загружает класс из IsolatedStorage и возвращает экземпляр, а затем вызвать это из другого проекта, добавив ссылку (в папке "Ссылки" в обозревателе решений) на первый проект во втором, чтобы вы могли вызвать его.