UWP树莓派3音乐播放器:如何让ListView最后一曲播放后停止
解决UWP音乐播放器最后一曲循环无法停止的问题
我来帮你排查并解决这个问题~先看你给出的objMediaPlayer_MediaEnded方法里有两处关键错误,直接导致了最后一曲无限循环的问题:
问题分析
- 判断条件逻辑错误:ListView的索引是从0开始的,最后一项的索引是
AudioFilesLV.Items.Count - 1,你原来写的SelectedIndex <= Items.Count会永远成立(哪怕选中索引已经超出列表范围),所以永远不会走到mediaElement.Stop()的分支。 - 索引更新笔误:
AudioFilesLV.SelectedIndex = AudioFilesLV.SelectedIndex = 1这行代码是错的,它会把选中索引直接固定为1,而不是跳到下一曲,这也是逻辑混乱的根源之一。
修正后的完整代码
private async void SongClicked(object sender, ItemClickEventArgs e) { var file = await KnownFolders.MusicLibrary.GetFileAsync(e.ClickedItem.ToString()); if (file != null) { mediaElement.Stop(); // 先停止当前播放,避免音频叠加 var stream = await file.OpenReadAsync(); mediaElement.SetSource(stream, file.ContentType); mediaElement.Play(); // 同步更新ListView选中项,确保MediaEnded事件能获取正确索引 AudioFilesLV.SelectedItem = e.ClickedItem; } } private void mediaItemList_SelectionChanged(object sender, SelectionChangedEventArgs e) { } private void objMediaPlayer_MediaOpened(object sender, RoutedEventArgs e) { mediaElement.Play(); } private async void objMediaPlayer_MediaEnded(object sender, RoutedEventArgs e) { int currentIndex = AudioFilesLV.SelectedIndex; int nextIndex = currentIndex + 1; // 只有当下一曲的索引在列表范围内时,才继续播放 if (nextIndex < AudioFilesLV.Items.Count) { AudioFilesLV.SelectedIndex = nextIndex; var file = await KnownFolders.MusicLibrary.GetFileAsync(AudioFilesLV.SelectedItem.ToString()); if (file != null) { var stream = await file.OpenReadAsync(); mediaElement.SetSource(stream, file.ContentType); mediaElement.Play(); } } else { // 播放完最后一曲,停止播放 mediaElement.Stop(); // 可选:重置选中索引,让UI状态更合理 // AudioFilesLV.SelectedIndex = -1; } }
额外优化说明
- 我在
SongClicked里加了mediaElement.Stop(),避免用户点击新歌曲时旧音频还在播放;同时同步更新了ListView的选中项,确保后续播放逻辑的索引正确。 - 把索引处理拆成
currentIndex和nextIndex,让逻辑更清晰,后续如果要加列表循环功能(播放完最后一曲回到开头),只需要把else分支改成AudioFilesLV.SelectedIndex = 0并播放即可。
内容的提问来源于stack exchange,提问作者user13671010
相关产品推荐
相关产品推荐

