4

我的问题是,我对 ApplicationSettings 所做的更改似乎没有在我的 AudioPlayerAgents ApplicationSettings 中更新,这应该是相同的?!

我的程序如下所示:

在 OnNavigatedTo 的 MainPage.xaml.cs 中,我正在创建两个音频文件数组

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);

但是当我以后想用另一个数组替换 MainPage.xaml.cs 中的 ApplicationSettings

  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;
    }
} 
4

3 回答 3

1

我有一种感觉,您在另一个程序集/dll 中有 MusicPlayerAgent。如果这样做可以解释问题,因为每个程序集都有自己的独立存储。如果他们在同一个程序集中,我不知道为什么这行不通,因为我自己在我拥有的几乎所有手机应用程序中都这样做。这是我读过的关于隔离存储的最佳读物。如果有什么我希望链接是一个很好的阅读。关联

于 2011-11-12T18:41:37.727 回答
1

我遇到了同样的问题。在我看来,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 中每个进程实际上只加载一次(因为它是静态变量)。查看代码,我发现没有其他地方调用 Reload。

我可以建议面临相同问题的每个人都使用“自己的”设置存储在 AudioAgent 和 App 之间共享动态数据(正如Philiiiiiipp在他的最终评论中所说)

据我所知,最佳做法是使用 AudioTrack.Tag 属性。

于 2013-12-09T06:39:01.860 回答
0

我不明白IsolatedStorage 是如何在Phone 上工作的。PC 应用程序中的相同命名空间具有明确的 Scope 属性,因此您至少可以判断是否有单独的父文件夹。

如果您不能通过简单地将所有文件从一个项目加载到另一个项目中将这两个项目组合成一个项目,那么至少您可以将一个类或方法添加到其中一个项目中,该项目从独立存储中加载该类并返回一个实例,然后调用它从另一个项目,添加一个引用(在解决方案资源管理器的 References 文件夹中)到第二个项目的第一个项目,以便您可以调用它。

于 2013-08-27T22:30:35.987 回答