在我的应用中,我想知道何时播放状态。但是我不知道如何订阅活动并获得当前状态。我怎样才能做到这一点?谢谢。
我在MSDN中看到了一个陈述,但不明白它的含义以及如何实现它:
在Windows Phone 8中,您可以检查Playstatechangedeventargs 确定CurrentPlayState和InterMediatePlayState 发生在音频播放器进入当前播放状态之前。
详细信息:
在主页上我这样做:
public MainPage()
{
BackgroundAudioPlayer.Instance.PlayStateChanged += new EventHandler(Instance_PlayStateChanged);
}
然后
private void Instance_PlayStateChanged(object sender, EventArgs e)
{
var playerState = BackgroundAudioPlayer.Instance.PlayerState;
}
,但我觉得这不是使用事件和EventArgs的正确方法。它也没有给我正确的最新值。
PlayerStateChanged
事件绝对是确定更改的正确方法,但是当您订阅它时它不会发射,因此您不会获得当前状态。尝试这样的事情:
BackgroundAudioPlayer audioPlayer = BackgroundAudioPlayer.Instance;
public MainPage()
{
audioPlayer += OnPlayStateChanged;
OnPlayStateChanged(audioPlayer.PlayerState);
}
private OnPlayStateChanged(object sender, EventArgs e)
{
OnPlayStateChanged(audioPlayer.PlayerState);
}
private OnPlayStateChanged(PlayState state)
{
// Process state here
}
话虽如此,值得指出的两件事。
首先,《背景audioplayer》是一种极为易变的API。如果不处于正确的内部状态,通常会抛出异常。请随时使用我为PodCaster开发的扩展方法:https://gist.github.com/richardszalay/8552812
其次,当播放位置更改时,PlayerStateChanged
不会触发。为此,我建议使用DispatcherTimer
并通过我的TryGetPosition
方法更新显示器(但仅当GetTrackOrDefault()
返回非null时)。我还建议使用子秒计时器(200-300ms)保持"滴答"正确。当游戏机更改为FastForwarding
或Rewinding
时,将计时器更新为20-30ms,并在返回Playing
时还原。
使用此解决方案以及链接您将获得解决方案: -
在此处输入链接说明
void Instance_PlayStateChanged(object sender, EventArgs e)
{
switch (BackgroundAudioPlayer.Instance.PlayerState)
{
case PlayState.Playing:
playButton.Content = "pause";
break;
case PlayState.Paused:
case PlayState.Stopped:
playButton.Content = "play";
break;
}
if (null != BackgroundAudioPlayer.Instance.Track)
{
txtCurrentTrack.Text = BackgroundAudioPlayer.Instance.Track.Title +
" by " +
BackgroundAudioPlayer.Instance.Track.Artist;
}
}