809
社区成员
发帖
与我相关
我的任务
分享
private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
if(e.newState == (int)WMPLib.WMPPlayState.wmppsMediaEnded)
{
MessageBox.Show(axWindowsMediaPlayer1.status + "\t" + axWindowsMediaPlayer1.playState );
}
}
你对播放列表的处理也不太合理,具体设计可以实际使用WMP播放一个列表来体会一下。
针对播放列表,所有的播放器都有这么几个模式:
单曲循环 - 播完继续播同首歌
随机播放 - 播完随便换首歌
顺序播放 - 播完放下首歌
不循环 - 播完就停在那儿
具体到wmp,它是用是否随机、是否循环两个属性控制的(比如随机+循环表示随机播放,不随机+循环表示顺序播放)
这个操作完全基于播放列表,无需人工干预。所以当你用了播放列表,就不应该再去用代码去操控播放行为,而是通过设置不同的播放模式让它自主工作。并且很重要的一点,使用播放列表的时候,需要准备好播放列表里的项,而不是即时添加,临时去取URL。
按你的描述,你的歌曲位于数据库,通过检测playstate来即时调取url,所以这时候其实你是在模拟基于播放列表的播放行为,自己重新实现一遍,也就根本用不到wmp的播放列表。你的代码问题就在这,将两种方式混淆了起来,又要模拟播放列表,又想使用自带的播放列表。
我建议你用两种方式的其中一种:
1. 完全不去尝试模拟播放列表的行为,只提供用户修改播放列表的功能。所有的一切交给wmp本身(它自己的播放控件已经自带播放、暂停、停止、修改播放模式、上一首下一首的功能了)
2. 如果要自己实现无播放列表,所有内容基于数据库,那就抛弃playlist,自己提供一个带有 循环(true/false)、 随机(true/false)、上一首、下一首、播放、暂停的控制面板,然后实现各个按钮的功能。并且在PlayStateChange事件中根据循环、乱序(这个只是你自己创建的变量,保存用户设置,wmp本身的设置永远强制为不循环、顺序)去控制播放行为和播放内容,模拟播放器的曲目切换。