windows phone7 中实现单曲循环播放

来源:互联网 发布:小跳蛙怎么火了 知乎 编辑:程序博客网 时间:2024/04/29 14:31

在wp7中利用mediaelement播放一首音乐,要求单曲循环播放!本以为很简单,按照自然的想法:首先音乐play,当播放完毕时会产生mediaEnded事件,在事件处理器中调用play()函数,再次播放,不就实现循环播放了吗?

            <MediaElement x:Name="fangbo" AutoPlay="False" Source="fangbo5s.mp3" MediaEnded="fangbo_MediaEnded" DataContext="{Binding}" />            <Button Content="Button" Height="72" HorizontalAlignment="Left" Margin="142,236,0,0" Name="button1" VerticalAlignment="Top" Width="160" Click="button1_Click" />

        private void button1_Click(object sender, RoutedEventArgs e)        {            fangbo.Play();        }        private void fangbo_MediaEnded(object sender, RoutedEventArgs e)        {                fangbo.Play();        }

运行,发现没有实现循环播放,只是为什么呢?</p><p>仔细研究MediaElement类,发现这样一个细节:(http://msdn.microsoft.com/en-us/library/cc189079(VS.95).aspx)

From the Playing state, the MediaEnded event may be raised if the media is finished. When this happens, the state may transition to either Stopped orPaused.

就是说在媒体播放完毕时,MediaEnded事件将被调用,这是currentstate可能变为Stopped或Paused!也就是说当播放完毕时,state不一定变为stopped,还有可能是Paused。

可以设想如果变成了paused,再次调用play时,将从“当前位置”播放,一旦播放,又停止,因为已经在文件的最末尾了。然后又出发了ended事件,再次调用play()。。。。

解决办法很简单:在play之前先调用stop,使得当前的state从paused变为stopped。这样紧接着调用play,事实证明这样的思路是正确的。

另外考虑到如下规则:

Avoid "Not specified" states. For example, you should not call the Play method while the media is in the Opening state. To avoid this, you could check the CurrentState of the MediaElement before allowing Play to be called

在调用之前先判断一下当前的state是否处在opening状态。最终代码如下:

        private void button1_Click(object sender, RoutedEventArgs e)        {            fangbo.Play();        }        private void fangbo_MediaEnded(object sender, RoutedEventArgs e)        {            if (fangbo.CurrentState != System.Windows.Media.MediaElementState.Opening)            {                fangbo.Stop();                fangbo.Play();            }        }


原创粉丝点击