2011-11-22 132 views
1

我正在WPF中製作媒體播放器。我正在考慮使用列表框控件播放列表。作爲播放列表的WPF媒體播放器列表框

我不知道如何綁定點擊列表框中的某個項目並播放該項目,也可以讓我的播放器對這些項目進行隨機或重複操作。

有什麼建議嗎?

+0

這個[link](http://stackoverflow.com/questions/2224435/playlist-for-wpf-mediaelement-app)沒有解決我的問題 – HomeMade

+0

你的內部歌曲結構如何看待這一刻?如果它是'IEnumerable',請參閱我的回答以獲得建議。 – Tobbe

回答

1

首先,您可以將ListBoxItemSource設置爲內部IEnumerable結構,例如包含對歌曲的引用的SongList = List<Song>。然後將DoubleClick事件處理程序附加到您的ListBox。在雙擊事件中,sender現在應該是您的ListBox。所選的項目(歌曲)應該是(sender as EventList).SelectedItems[0]。看看這個項目是否在你的SongList,如果是,玩吧!

你的XAML代碼看起來是這樣的:

<Grid> 
    <ListBox Name="songList" MouseDoubleClick="songList_MouseDoubleClick"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Path=songName}"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 

而在你的初始化代碼:

songList.ItemSource = InternalSongList; 

和事件處理程序:

private void songList_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    Controls.ListBox songList = sender as Controls.ListBox; 
    if (songList.SelectedItems.Count > 0) 
    { 
     Song selectedSong = songList.SelectedItems[0]; 

     // To be on the safe side 
     if (InternalSongList.Contains(selectedSong)) 
     { 
      selectedSong.Play(); 
     } 
    } 
} 

這當然也可以有改善安全性,我想這首歌的演奏在現實中會更復雜一些。至於洗牌,爲您的內部列表選擇一個索引的隨機函數應該可能做到這一點。重複應該同樣簡單:計數播放的歌曲並確保沒有歌曲播放兩次。當所有歌曲播放一次後,清除播放的歌曲列表並重復播放!使用IEnumerable的好處是,您不需要觸摸ListBox那麼多,只需設置ItemsSource,它就可以很好地處理它自己。

+0

我的列表框是否可能是歌曲列表,而不是創建IEnumerable? – HomeMade

+0

是的,因爲'List'實現了'IEnumerable'。在這種情況下,您可以將'IEnumerable'接口視爲一個條件:任何要用作ListBox的'ItemSource'的容器都需要實現'IEnumerable'。 'List'和許多其他C#容器實現這個接口。 – Tobbe