C# Mediaplayer WinForm赢得';不玩

C# Mediaplayer WinForm赢得';不玩,c#,winforms,media-player,C#,Winforms,Media Player,我有一个代码,它检查一首歌是否已经结束,是否已经结束,并选择下一首歌。我在列表框中有歌曲名称,因此当选择下一首歌曲时,第一个函数将触发。你能解释一下为什么它不放这首歌吗 private void Files_SelectedIndexChanged(object sender, EventArgs e) { player.URL = percorsi[Files.SelectedIndex]; } private void player_PlayStateChange(object s

我有一个代码,它检查一首歌是否已经结束,是否已经结束,并选择下一首歌。我在列表框中有歌曲名称,因此当选择下一首歌曲时,第一个函数将触发。你能解释一下为什么它不放这首歌吗

private void Files_SelectedIndexChanged(object sender, EventArgs e)
{
    player.URL = percorsi[Files.SelectedIndex];
}

private void player_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent er)
{
    if (er.newState == 8)
    {
        Files.SetSelected((Files.SelectedIndex + 1) % nomi.Length , true);
    }
}

Microsoft的URL属性帮助页有以下注释

不要从事件处理程序代码调用此方法。从事件处理程序调用URL可能会产生意外结果

你也可以看到前一篇文章

我提出的解决方案虽然不是最好的,但就是在表单上创建一个计时器并实现_Tick处理程序。然后在表单中,我还创建了一个布尔值(初始化为false),以指示应该播放一个新文件

    private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
    {
        if (e.newState == 8)
        {
            Files.SelectedIndex = File.SelectedIndex + 1;
        }
    }

    private void Files_SelectedIndexChanged(object sender, EventArgs e)
    {
        playNewFile = true;
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (playNewFile)
        {
            axWindowsMediaPlayer1.URL = percorsi[Files.SelectedIndex];
            playNewFile = false;
        }
    }
我将计时器间隔设置为100毫秒,并在Form_Load事件中启动它

    private void Form1_Load(object sender, EventArgs e)
    {
        timer1.Interval = 100;
        timer1.Start();
    }