4

我有这个 FolderBrowseDialog

  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 播放列表。我将如何实现这一目标?

4

2 回答 2

4

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;

当您使用隐式类型变量 ( )遍历循环时,listView1.Items将被视为. 所以当你调用时,你实际上是在调用它。与许多其他 .NET 类一样 -覆盖该方法。看起来像这样:foreachvarmediaobjectToString()ListViewItemListViewItemSystem.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 }";),这显然是行不通的。

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

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

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

于 2013-09-12T00:33:22.533 回答
1

像这样的东西应该工作:

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;
于 2013-09-11T23:19:03.053 回答