Как вы можете позволить медиа-элементу автоматически воспроизводить следующий элемент списка?

Я делаю медиаплеер, в котором добавляю медиафайлы в список. Я хотел бы сделать так, чтобы медиа-элемент автоматически запускал воспроизведение следующей песни/видео в списке после окончания текущего. Также я хотел бы сделать событие двойного щелчка, где, если щелкнуть элемент списка, должна воспроизводиться песня/видео. Это то, что у меня есть на данный момент:

Xaml:

<MediaElement Name="objMediaPlayer" LoadedBehavior="Manual" UnloadedBehavior="Stop" MediaOpened="objMediaPlayer_MediaOpened" MediaEnded="objMediaPlayer_MediaEnded" Margin="20,19,20,40" ButtonBase.Click="mediaItemList_MouseDoubleClick" />

<ListBox Canvas.Left="882" Canvas.Top="12" Height="467" Name="mediaItemList" Width="260" Background="Gray" MouseDoubleClick="mediaItemList_MouseDoubleClick" />

cs-лист:

 private void BrowseButtonClick(object sender, RoutedEventArgs e)
    {
        System.Windows.Forms.OpenFileDialog dlg = new System.Windows.Forms.OpenFileDialog();
        dlg.Multiselect = true;
        dlg.InitialDirectory = "c:\\";
        dlg.Filter = "All Files (*.*)|*.*";
        dlg.RestoreDirectory = true;

        if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            foreach (string file in dlg.FileNames)
            {
                FileInfo fileName = new FileInfo(file);
                mediaItemList.Items.Add(fileName);
            }
            string selectedFileName = dlg.FileName;
            fileNameLabel.Content = selectedFileName;
            objMediaPlayer.Source = new Uri(selectedFileName);
            objMediaPlayer.Play();
            lblCoverUp.Visibility = Visibility.Hidden;


        }
    }
private int currentSongIndex = -1;
    private void objMediaPlayer_MediaEnded(object sender, RoutedEventArgs e)
    {

            if (currentSongIndex == -1)
            {
                currentSongIndex = mediaItemList.SelectedIndex;
            }
            currentSongIndex++;
            if (currentSongIndex < mediaItemList.Items.Count)
            {

                objMediaPlayer.Play();
            }
            else
            {
                // last song in listbox has been played
            }           
    }



    private void mediaItemList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

    }

Для функции двойного щелчка

    private void mediaItemList_MouseDoubleClick(object sender, RoutedEventArgs e)
    {
        System.Windows.Controls.Button prevButton = objMediaPlayer.Tag as System.Windows.Controls.Button;
        System.Windows.Controls.Button button = (sender as System.Windows.Controls.Button);
        FileInfo fileInfo = button.DataContext as FileInfo;

        // If a file is playing, stop it

        if (prevButton != null)
        {
            objMediaPlayer.Tag = null;
            objMediaPlayer.Stop();
            prevButton.Background = Brushes.LightYellow;
           // if the one thats playing is the one that was clicked -> don't play it
            if (prevButton == button)
                return;
        }
        // Play the one that was clicked
        objMediaPlayer.Tag = button;
        objMediaPlayer.Source = new Uri(fileInfo.FullName);
        objMediaPlayer.Play();
    }

Для Media_ended я уже пробовал: objMediaPlayer.Play(mediaItemList.Items[currentSongIndex]);

При активации события Doubleclick я получаю следующую ошибку: Ссылка на объект не указывает на экземпляр объекта. (FileInfo fileInfo = button.DataContext as FileInfo).

Я надеюсь, что кто-то может мне помочь. Если вам нужна дополнительная информация, просто спросите

РЕДАКТИРОВАТЬ: я исправил большую часть проблемы с окончанием носителя, используя следующий код:

    private void objMediaPlayer_MediaEnded(object sender, RoutedEventArgs e)
    {
        objMediaPlayer.Stop();

        if (mediaItemList.SelectedIndex <= mediaItemList.Items.Count)
        {
            mediaItemList.SelectedIndex = mediaItemList.SelectedIndex += 1;
            fileNameLabel.Content = mediaItemList.SelectedItem;
            objMediaPlayer.Play();
        }
        else
        {
            objMediaPlayer.Stop();
            fileNameLabel.Content = " ";
        }
    }

Единственная проблема сейчас в том, что проигрыватель не останавливается после окончания последней песни (listitem). Как это исправить.


person Jah Vie    schedule 25.09.2014    source источник
comment
Это потому, что вы дважды щелкаете не по кнопке, а по списку. Поставьте точку останова на этой строке и просмотрите значение отправителя в отладчике.   -  person Lee O.    schedule 25.09.2014
comment
Это то, что я получаю после отладки, для меня это не имеет смысла. В Nova.exe произошло первое случайное исключение типа «System.NullReferenceException». Шаг в: Обход непользовательского кода «MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen». Поток «‹Thread Ended›» (0x1638) завершился с код 0 (0x0).   -  person Jah Vie    schedule 25.09.2014
comment
Извините, мое заявление было вокруг вашего второго вопроса. Строка System.Windows.Controls.Button button = (отправитель как System.Windows.Controls.Button); устанавливает button = null, потому что отправитель не является кнопкой. Затем следующая строка вызывает исключение NullReferenceException из-за этого.   -  person Lee O.    schedule 25.09.2014
comment
хорошо, это имеет смысл. У вас есть какие-нибудь идеи о том, что я должен сделать отправителя тогда? Может быть, выбранный индекс или, возможно, элементы списка?   -  person Jah Vie    schedule 25.09.2014


Ответы (1)


Конечно, вам нужно открывать каждый файл перед тем, как их воспроизвести?:

private void objMediaPlayer_MediaEnded(object sender, RoutedEventArgs e)
{
    if (currentSongIndex == -1)
    {
        currentSongIndex = mediaItemList.SelectedIndex;
    }
    currentSongIndex++;
    if (currentSongIndex < mediaItemList.Items.Count)
    {
        objMediaPlayer.Open(new Uri(mediaItemList.ElementAt(currentSongIndex), 
            UriKind.Absolute));            
    }
    else
    {
        // last song in listbox has been played
    }           
}

private void MediaPlayer_MediaOpened(object sender, EventArgs e)
{
    objMediaPlayer.Play();
}
person Sheridan    schedule 25.09.2014
comment
objMediaplayer не имеет определения Open. Не могли бы вы объяснить, что вы сделали. Спасибо! - person Jah Vie; 25.09.2014
comment
Ой, извините, я не понял, что ваш плохо названный объект objMediaPlayer на самом деле был MediaElement. Вместо этого попробуйте использовать реальный объект MediaPlayer. - person Sheridan; 25.09.2014
comment
Я использую wpf, и каждый раз, когда я пытаюсь добавить медиаплеер в свой набор инструментов (конечно, после добавления ссылки), он терпит неудачу. Я добавляю элемент управления, но он не отображается в моем наборе инструментов. Вот почему я вместо этого использовал медиа-элемент. - person Jah Vie; 25.09.2014