Как выбрать и воспроизвести несколько песен в списке? - PullRequest
0 голосов
/ 29 августа 2011

У меня есть требование, мне нужно воспроизвести несколько звуковых песен в окне, используя wpf. Может кто-нибудь предложить лучший способ реализовать это.

У меня есть окно. Там я покажу список песен в списке. Пользователь должен иметь возможность выбрать несколько песен из списка и нажать кнопку воспроизведения.

Я должен воспроизвести все аудио-песни, выбранные пользователем по одной.

Буду признателен за вашу помощь.

1 Ответ

1 голос
/ 29 августа 2011

Самый простой способ сделать это - иметь элемент управления 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>
...