2011-02-27 38 views
1

解决了一个问题,另一个问题:在C#程序中,我使用以下方法将标签颜色设置为绿色,然后播放mp3文件并最终将颜色设置为黑色。 问题在于声音似乎是在一个额外的线程中播放的,因此两种颜色变化之间的时间太短(实际上,播放文件时应该有绿色)。MP3在不同的线程中播放

private void playSound() 
    { 
     label1.ForeColor = Color.LimeGreen; 
     Application.DoEvents(); 

     WMPLib.WindowsMediaPlayer wmp = new WMPLib.WindowsMediaPlayer(); 
     wmp.URL = @"C:\examplesound.mp3"; // duration about 30s 
     wmp.controls.play(); 

     label1.ForeColor = Color.Black; 
    } 

有什么办法可以强制标签在播放mp3文件时保持绿色?

回答

3

当播放位于另一个线程中时,不要立即将颜色设置回黑色。

当前曲目结束时WMPLib发出一个PlayStateChange事件。

所以添加一个处理程序:

wmp.PlayStateChange += this.Player_PlayStateChange; 

private void Player_PlayStateChange(int newState) 
{ 
    if ((WMPLib.WMPPlayState)newState == WMPLib.WMPPlayState.wmppsStopped) 
    { 
     label1.ForeColor = Color.Black; 
    } 
} 

的页面playState有值的列表:

8 - MediaEnded - 媒体项已完成播放。

您需要确保这是在UI线程上完成的。

+0

打败我,但我会将newState转换为'WMPLib.WMPPlayState',并比较它而不是使用幻数。例如'if(WMPLib.WMPPlayState)newState == WMPLib.WMPPlayState.wmppsStopped)' – Alan 2011-02-27 17:56:23

+0

@Alan - 实际上。我正准备更新答案 – ChrisF 2011-02-27 17:58:31

0

尝试挂钩PlayStateChanged事件并将label1.ForeColor = Color.Black;放在那里。

目前,您的代码中没有任何内容说明只有当它开始播放后,它才应该变为黑色。