2011-08-29 51 views
0

我有一個要求,我需要在窗口上使用wpf播放多個音頻歌曲。任何人都可以提出實現此目的的最佳方法。如何選擇和播放列表中的多首歌曲?

我有窗戶。在那裏,我將在列表框中顯示歌曲列表。用戶應該可以從列表框中選擇多首歌曲,然後點擊播放。

我必須一一播放用戶選擇的所有音頻歌曲。

我會感謝您的幫助。

回答

1

最簡單的方法是使ListBox控件的ItemsSource屬性綁定到某個集合(例如「SongList」)。

<ListBox Name="lstSongs" ItemsSource="{Binding Path=SongList}" SelectionMode="Extended" Grid.Row="1" /> 

有下一首歌曲

<MediaElement Name="player" MediaEnded="MediaElement_MediaEnded" LoadedBehavior="Play" UnloadedBehavior="Stop" Source="{Binding Path=CurrentlyPlaying}" /> 

頁面收聽一個MediaElement控件當用戶點擊窗體上的按鈕,當前選擇的項目添加到隊列中。通過閱讀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); 
} 

(確保CurrentlyPlaying財產引發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); 
    } 
} 

主窗口.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> 
+0

我得到隊列附近錯誤。什麼應該怎麼辦?請幫我 – Radhika

+0

我選擇了2首歌曲從列表框中,我加入到隊列中,然後我點擊播放按鈕...但它是不是在玩...我該怎麼辦? – Radhika

+0

您是否正確設置了綁定? Uri是否有效?我已經用完整源代碼更新了我的帖子。 – fatty

相關問題