【问题标题】:Playlist in C# (axWindowsMediaPlayer)C# 中的播放列表 (axWindowsMediaPlayer)
【发布时间】:2013-09-11 23:11:12
【问题描述】:

我有这个文件夹浏览对话框

  FolderBrowserDialog fbd = new FolderBrowserDialog();
        fbd.ShowNewFolderButton = true;
        fbd.RootFolder = Environment.SpecialFolder.MyComputer;

        if (fbd.ShowDialog() == DialogResult.OK)
        {
            string folder = fbd.SelectedPath;
            foreach (string f in Directory.GetFiles(folder))
                this.listView1.Items.Add(f);  
        }

我想将 ListView1 中的所有歌曲添加到 axwindowsmediaplayer 播放列表。我将如何实现这一目标?

【问题讨论】:

  • 这并不能解决您的主要问题,但您可能需要检查目录中的文件以确保媒体播放器支持它们。
  • 您还有问题吗?

标签: c# winforms media-player


【解决方案1】:

ListViewItemCollection 没有实现通用的ICollection<T>IEnumerable<T> 接口,因此编译器无法通过查看Items 集合来猜测类型。因此,为什么您必须明确告诉 foreach 循环它正在迭代 ListViewItem 类型的集合,而不是使用 var

因此,以下代码有效:

var myPlayList = 
      axWindowsMediaPlayer1.playlistCollection.newPlaylist("MyPlayList");

foreach (ListViewItem media in listView1.Items)
{
      var mediaItem = axWindowsMediaPlayer1.newMedia(media.Text);
      myPlayList.appendItem(mediaItem);
}

axWindowsMediaPlayer1.currentPlaylist = myPlayList;

当您使用隐式类型变量 (var) 在 foreach 循环中迭代 listView1.Items 时,media 将被视为 object。因此,当您调用ToString() 时,您实际上是在调用ListViewItem。与许多其他 .NET 类一样 - ListViewItem 覆盖了 System.Object.ToString() 方法。看起来像这样:

public override string ToString()
{
    return "ListViewItem: {" + this.Text + "}";
}

因此,当您使用foreach (var media in listView1.Items) 并调用axWindowsMediaPlayer1.newMedia(media.ToString()) 时会发生什么,您实际上是在调用axWindowsMediaPlayer1.newMedia("ListViewItem: { C:\\Users\\...\\file.mp3 }";),这显然不起作用。

但是,您可以通过将要迭代的每个项目转换为 ListViewItem 来成功使用 var,如下面的代码所示。

        foreach (var media in listView1.Items)
        {
            var fileLocation = (ListViewItem)media; // This step is critical!
            var mediaItem = axWindowsMediaPlayer1.newMedia(fileLocation.Text);
            myPlayList.appendItem(mediaItem);
        }

但我认为这首先破坏了使用var 的大部分意义。

【讨论】:

    【解决方案2】:

    这样的事情应该可以工作:

    var pathToFiles = "Path to where the media files are stored";
    
    var mediaPlayer = new AxWMPLib.AxWindowsMediaPlayer();
    var myPlaylist = mediaPlayer.playlistCollection.newPlaylist("myPlaylist");
    
    foreach (ListViewItem fileName in listView1.Items) {
      var media = mediaPlayer.newMedia(Path.Combine(pathToFiles, fileName.Text);
      myPlaylist.appendItem(media);
    }
    
    mediaPlayer.currentPlaylist = myPlaylist;
    

    【讨论】:

    • 是的......嗯,它是“这样的东西应该工作”。尽管我现在对其进行了一些更改,但仍然:这样的东西应该可以工作。如果它不起作用,那么找出原因。做一些研究。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多