Самый простой способ сделать это - иметь элемент управления ListBox со свойством ItemsSource, привязанным к некоторой коллекции (например, "SongList").
<ListBox Name="lstSongs" ItemsSource="{Binding Path=SongList}" SelectionMode="Extended" Grid.Row="1" />
Иметь элемент управления MediaElement на странице, прослушиваяследующая песня
<MediaElement Name="player" MediaEnded="MediaElement_MediaEnded" LoadedBehavior="Play" UnloadedBehavior="Stop" Source="{Binding Path=CurrentlyPlaying}" />
Когда пользователь нажимает кнопку на форме, выбранные в настоящий момент элементы добавляются в очередь.Выбранные в настоящий момент элементы можно найти, прочитав свойство ListBox.SelectedItems.
private void cmdQueueItems_Click(object sender, RoutedEventArgs e)
{
Queue = lstSongs.SelectedItems.OfType<Uri>().ToList();
playNext();
}
Затем вы начинаете воспроизводить первый элемент в очереди, а когда возникает событие MediaElement.MediaEnded
, замените текущий воспроизводимый элемент.со следующим элементом в очереди, если таковой имеется.
private void MediaElement_MediaEnded(object sender, RoutedEventArgs e)
{
playNext();
}
Вы будете делать это, пока пользователь не нажмет предопределенную кнопку остановки.
Метод playNext()
будет просто
private void playNext()
{
CurrentlyPlaying = Queue.FirstOrDefault();
if (CurrentlyPlaying != null)
Queue.Remove(CurrentlyPlaying);
}
(Убедитесь, что свойство CurrentPlaying вызывает событие INotifyPropertyChanged.PropertyChanged
)
MainWindow.xaml.cs
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
public List<Uri> Queue { get; private set; }
#region CurrentlyPlaying Definition
private Uri _CurrentlyPlaying = null;
public Uri CurrentlyPlaying
{
get
{
return _CurrentlyPlaying;
}
set
{
_CurrentlyPlaying = value;
OnPropertyChanged("CurrentlyPlaying");
}
}
#endregion // end of CurrentlyPlaying region
public System.Collections.ObjectModel.ObservableCollection<Uri> SongList { get; private set; }
public MainWindow()
{
InitializeComponent();
DataContext = this;
SongList = new System.Collections.ObjectModel.ObservableCollection<Uri>();
SongList.Add(new Uri(@"E:\Music\_relaxation\African Drums - Tribal Music.mp3"));
SongList.Add(new Uri(@"E:\Music\Disturbed\Disturbed - A Welcme Burden.mp3"));
}
private void cmdQueueItems_Click(object sender, RoutedEventArgs e)
{
Queue = lstSongs.SelectedItems.OfType<Uri>().ToList();
playNext();
}
private void cmdSkipItem_Click(object sender, RoutedEventArgs e)
{
playNext();
}
private void MediaElement_MediaEnded(object sender, RoutedEventArgs e)
{
playNext();
}
private void playNext()
{
CurrentlyPlaying = Queue.FirstOrDefault();
if (CurrentlyPlaying != null)
Queue.Remove(CurrentlyPlaying);
}
}
MainWindow.xaml
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<MediaElement Name="player" MediaEnded="MediaElement_MediaEnded" LoadedBehavior="Play" UnloadedBehavior="Stop" Source="{Binding Path=CurrentlyPlaying}" />
<ListBox Name="lstSongs" ItemsSource="{Binding Path=SongList}" SelectionMode="Extended" Grid.Row="1" />
<Button Content="Play selected" Click="cmdQueueItems_Click" Grid.Row="2" />
<Button Content="Skip" Click="cmdSkipItem_Click" Grid.Row="3" />
</Grid>