Windows Media Player состояние не изменится - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь сделать так, чтобы, когда песня заканчивается, автоматически воспроизводится следующая. Я загружаю названия песен в список, и у меня также есть словарь SongsNPaths, в котором ключи содержат название песен изначения имеют полный путь. У меня также есть кнопка воспроизведения, и она используется для воспроизведения песни после того, как она была приостановлена. Также песня будет воспроизводиться, когда я нажимаю на ее имя в списке. Все работает, как и предполагалось, когда я делаю это вручнуюоднако, когда я пытаюсь заставить песню играть после того, как предыдущий закончился, это не произойдет. Даже если я изменяю индекс списков, ничего не происходит, и состояние WMP находится в стеке на Ready. Также, хотя индекс изменяется и ничего не происходит, URL-адрес WMP обновляется, так какесли я вручную нажимаю кнопку воспроизведения, песня начинается нормально. Есть идеи, что мне не хватает?

код:
Кнопка воспроизведения:

private void button2_Click(object sender, EventArgs e)
        {
            //elexgei an exei klikaristei idi mia fora to button wste na min dinei sunexws to path kai to tragoudi na xekinaei apo tin arxi

            if (listBox1.SelectedItem != null)
            {

                axWindowsMediaPlayer1.Ctlcontrols.play();
            }
        }


Событие при каждом изменении значения, выбранного в списке:

private void listBox1_SelectedValueChanged(object sender, EventArgs e)
        {
            if (listBox1.SelectedItem != null)
            {

                axWindowsMediaPlayer1.URL = SongsNPaths[listBox1.SelectedItem.ToString()];
                axWindowsMediaPlayer1.Ctlcontrols.play();
            }
        }

Событие после окончания песни:

private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
        {//check to state to WMP an einai finished ---> 8 to allazei tragoudi (bazei to epomeno)

            if(e.newState == 8)
            {
                if(listBox1.Items.Count > 1)
                {
                    if (listBox1.SelectedIndex != listBox1.Items.Count - 1)
                    {
                        listBox1.SelectedIndex++;

                        axWindowsMediaPlayer1.URL = SongsNPaths[listBox1.SelectedItem.ToString()];

                        //button2.PerformClick();

                        axWindowsMediaPlayer1.Ctlcontrols.play();


                    }
                }
            }
        }

1 Ответ

0 голосов
/ 31 января 2019

Следующее должно помочь вам.

if(e.newState == 8)
{
   if(listBox1.Items.Count > 1)
   {
         if (listBox1.SelectedIndex != listBox1.Items.Count - 1)
         {
               listBox1.SelectedIndex++;
               axWindowsMediaPlayer1.URL = SongsNPaths[listBox1.SelectedItem.ToString()];

               this.BeginInvoke(new Action(() => {
                this.axWindowsMediaPlayer1.URL = newFilePath;
            }));
         }
   }
}

Если вы проверяете документацию свойства AxWindowsMediaPlayer.Url , не рекомендуется вызывать это свойство непосредственно из обработчика событий.

Не вызывайте этот метод из кода обработчика событий.Вызов URL из обработчика событий может привести к неожиданным результатам.

Один из вариантов будет таким, как описано в коде выше.

...