我有一个解决方案,其中包括 2 个项目:主要项目和 PlayListFilePlayBackAgent。
在主项目中,在 MainPage 中有一个 listBox,它显示不同的内容。某些内容具有音频格式,当我在列表框的项目中看到标题和表演者时 - 我单击此列表框项目中的“播放”按钮。此按钮进行一些操作(从某个服务器获取曲目的 url),然后转到页面 AudioPage。在 AudioPage 中,一些方法从这些 url 中创建一个播放列表,而不是以 xml 格式(序列化)保存在 isolatedStorage 中。这是 PlayList.cs
public class Playlist
{
public Playlist()
{
Tracks = new List<PlaylistTrack>();
}
[XmlElement(ElementName = "Track")]
public List<PlaylistTrack> Tracks { set; get; }
[XmlElement(ElementName = "TrackCount")]
public int TrackCount { set; get; }
public static Playlist Load(string filename)
{
Playlist playlist = null;
using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
{
using (IsolatedStorageFileStream stream = storage.OpenFile(filename, FileMode.Open))
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Playlist));
playlist = xmlSerializer.Deserialize(stream) as Playlist;
}
}
return playlist;
}
public void Save(string filename)
{
using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
{
using (IsolatedStorageFileStream stream = storage.CreateFile(filename))
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Playlist));
xmlSerializer.Serialize(stream, this);
}
}
}
}
并且 PlayBackAgent 将此 xml 反序列化为播放列表,并播放它。
这一切都很好,但是当我想听那些不在列表框中的曲目时,我遇到了问题。我回到我的列表框,然后选择一些曲目并按下“播放”按钮。在按钮处理程序中,.Clear();
我的收藏,获取新曲目的新网址,转到 AudioPage 并制作一个新的播放列表。但是在模拟器中,我看到了我以前听过的相同音乐。我认为问题在于 PlayListFilePlayBackAgent 没有从isolatedStorade 更新播放列表。但是当我单击不同的按钮“播放”时 - 字段 TrackCount 发生变化(不要介意它的名称,它只是说明播放列表中必须播放播放器的曲目数),我可以在写入时在输出中看到Debug.WriteLine(Convert.ToString(playlist.TrackCount));
它AudioPlayer.cs
. 所以我有:一个音频播放器,它只播放我给他的第一个播放列表中的音乐。当我想收听另一个播放列表时 - 在 AudioPage 中,我看到了旧的播放列表,并且只能从那些旧的播放列表中收听音乐。我想要的是一个音频播放器,每次按下“播放”按钮时都可以更改播放列表,并且可以播放此音乐。
PS:我使用 PlayListFilePlayBackAgent 因为即使我关闭这个应用程序它也可以播放音乐。如果您需要更多代码 - 请告诉我。谢谢。
更新:按钮处理程序
private void Audio_Button_Click(object sender, RoutedEventArgs e)
{
string uri = null;
TextBox tb = null;
var grid = (Grid)((Button)sender).Parent;
foreach (var child in grid.Children)
{
if (child is TextBox && (string)((TextBox)child).Tag == "URL")
{
tb = (TextBox)child;
}
}
uri = tb.Text;
BackgroundAudioPlayer.Instance.SkipNext();
//MessageBox.Show(uri);
string url = string.Format("https://api.vk.com/method/audio.getById.xml?audios={0}&access_token={1}", uri, App.AccessToken);
var c = new WebClient();
c.OpenReadCompleted += (sender1, e1) =>
{
XDocument xml = XDocument.Load(e1.Result);
MessageBox.Show(xml.ToString());
var inf = from u in xml.Descendants("audio")
select u;
AudioPage.audios.Clear();
foreach (var item in inf)
{
AudioPage.audios.Add(new AudioAttachment((string)item.Element("url"), (string)item.Element("title"), (string)item.Element("artist")));
}
string destination = string.Format("/AudioPage.xaml");
NavigationService.Navigate(new Uri(destination, UriKind.Relative));
AudioPage.count = 0;
};
c.OpenReadAsync(new Uri(url));
}
OnUseraction.cs
protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param)
{
switch (action)
{
case UserAction.Play:
if (player.Track == null)
{
// Load playlist from isolated storage
if (playlist == null)
playlist = Playlist.Load("playlist.xml");
// Debug.WriteLine(playlist.Tracks[0].Title);
Debug.WriteLine(Convert.ToString(playlist.TrackCount));
currentTrack = playlist.TrackCount;
player.Track = playlist.Tracks[currentTrack].ToAudioTrack();
}
else
{
player.Play();
}
break;
case UserAction.Pause:
player.Pause();
break;
case UserAction.SkipNext:
if (currentTrack < playlist.Tracks.Count - 1)
{
currentTrack += 1;
player.Track = playlist.Tracks[currentTrack].ToAudioTrack();
}
else
{
player.Track = null;
}
break;
case UserAction.SkipPrevious:
if (currentTrack > 0)
{
currentTrack -= 1;
player.Track = playlist.Tracks[currentTrack].ToAudioTrack();
}
else
{
player.Track = null;
}
break;
case UserAction.Seek:
player.Position = (TimeSpan)param;
break;
}
NotifyComplete();
}