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
相关产品推荐
相关产品推荐

