我有一個要求,我需要在窗口上使用wpf播放多個音頻歌曲。任何人都可以提出實現此目的的最佳方法。如何選擇和播放列表中的多首歌曲?
我有窗戶。在那裏,我將在列表框中顯示歌曲列表。用戶應該可以從列表框中選擇多首歌曲,然後點擊播放。
我必須一一播放用戶選擇的所有音頻歌曲。
我會感謝您的幫助。
我有一個要求,我需要在窗口上使用wpf播放多個音頻歌曲。任何人都可以提出實現此目的的最佳方法。如何選擇和播放列表中的多首歌曲?
我有窗戶。在那裏,我將在列表框中顯示歌曲列表。用戶應該可以從列表框中選擇多首歌曲,然後點擊播放。
我必須一一播放用戶選擇的所有音頻歌曲。
我會感謝您的幫助。
最簡單的方法是使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>
我得到隊列附近錯誤。什麼應該怎麼辦?請幫我 – Radhika
我選擇了2首歌曲從列表框中,我加入到隊列中,然後我點擊播放按鈕...但它是不是在玩...我該怎麼辦? – Radhika
您是否正確設置了綁定? Uri是否有效?我已經用完整源代碼更新了我的帖子。 – fatty