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

WPF C#开发MP3播放器单独新增歌曲名称重复Bug求助

问题根因

你的代码问题出在Playlist.Items.Add的取值逻辑上:
每次触发添加操作时,循环变量i都是从0开始计数,直接取Files[i]也就是整个Files列表的前N项(N为本次新增的文件数量),而不是本次刚添加到列表末尾的新元素。
比如首次添加2首歌,Files列表为[歌曲1, 歌曲2],循环i=0、1时取的刚好是刚新增的内容,显示正常;第二次再添加2首歌,Files列表变成[歌曲1, 歌曲2, 新歌曲1, 新歌曲2],但循环i还是从0开始,取Files[0]、Files[1]也就是首次添加的两首歌名,所以会出现名称重复的问题。

修复方案

方案1:直接用本次读取的文件名添加(推荐)

改用foreach遍历,直接取本次读到的文件名添加到播放列表,避免索引计算错误:

private List<String> Files = new List<string> { };
private List<String> Paths = new List<string> { };

private void AddSong_Click(object sender, RoutedEventArgs e)
{
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Multiselect = true;
    if (ofd.ShowDialog() == true)
    {
        mediaPlayer.Stop();
        foreach (var filePath in ofd.FileNames)
        {
            var fileName = System.IO.Path.GetFileNameWithoutExtension(filePath);
            Files.Add(fileName);
            Paths.Add(filePath);
            Playlist.Items.Add(fileName);
        }
    }
}

方案2:保留for循环的调整写法

如果需要保留for循环写法,新增变量记录本次添加前列表的原始长度,取值时叠加偏移量即可:

private void AddSong_Click(object sender, RoutedEventArgs e)
{
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Multiselect = true;
    if (ofd.ShowDialog() == true)
    {
        mediaPlayer.Stop();
        // 记录添加前的列表长度,作为本次新增元素的偏移基准
        int originalCount = Files.Count;
        for (int i = 0; i < ofd.FileNames.Length; i++)
        {
            Files.Add(System.IO.Path.GetFileNameWithoutExtension(ofd.FileNames[i]));
            Paths.Add(ofd.FileNames[i]);
            Playlist.Items.Add(Files[originalCount + i]);
        }
    }
}

内容的提问来源于stack exchange,提问作者Gloozzy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:45:04