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