You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP树莓派3音乐播放器:如何让ListView最后一曲播放后停止

解决UWP音乐播放器最后一曲循环无法停止的问题

我来帮你排查并解决这个问题~先看你给出的objMediaPlayer_MediaEnded方法里有两处关键错误,直接导致了最后一曲无限循环的问题:

问题分析

  1. 判断条件逻辑错误:ListView的索引是从0开始的,最后一项的索引是AudioFilesLV.Items.Count - 1,你原来写的SelectedIndex <= Items.Count会永远成立(哪怕选中索引已经超出列表范围),所以永远不会走到mediaElement.Stop()的分支。
  2. 索引更新笔误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:17:34