我在使用C#制作的媒体播放器时遇到了一些问题,我已经在stackoverflow中询问了另一个问题,但现在我有一个不同的问题,我认为这是最后一个问题。
我想将MP3和WAV文件拖放到Windows窗体中的列表框中,我可以正确删除它们,但是如果不显示文件的完整路径,我就无法播放它们。
这是我到目前为止所做的:
private void listBox1_DragDrop(object sender, DragEventArgs e)
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false);
foreach (string m in files)
{
listBox1.Items.Add(Path.GetFileNameWithoutExtension(m));
mediaList.Add(m);
}
mediaList 是一个帮助我保存播放列表的列表。 listbox1 是我的主要播放列表。
要播放歌曲我使用此代码,该代码一直运行良好,直到现在:
axWindowsMediaPlayer1.URL = mediaList[listBox1.SelectedIndex];
提前致谢。 -ChrisCreateBoss
答案 0 :(得分:0)
列表框项目可以包含对象。由于您希望能够访问全名,但只显示文件名,因此该类将存储已删除的全名,但仅显示文件名部分。当有几个信息要为每个项目保存时,这些都很方便。
class FileItem
{
public string FullName { get; set; }
public FileItem(string file)
{
FullName = file;
}
public override string ToString()
{
return Path.GetFileNameWithoutExtension(FullName);
}
}
保存整个名称,但只使用覆盖显示短名称。删除文件后,我们将从中创建FileItem对象。然后有两个选择:
a)将对象放在ListBox中并删除mediaList或
b)将新项目放在medialist中并将其用作DataSource
这将是第二个,因为mediaList没有粘贴到UI。请务必更改mediaList
,如下所示:
// new mediaList
List<FileItem> mediaList = new List<FileItem>();
...
private void lb1_DragDrop(object sender, DragEventArgs e)
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false);
foreach (string f in files)
{
mediaList.Add(new FileItem(f));
}
// tell the LB to display whatever is in mediaList
lb1.DataSource = mediaList;
}
而不是 2 文件的副本,mediaList
中的内容也显示在ListBox
;其中的FileItem
个对象只显示短名称。您的原始代码应该使用调整:
axWindowsMediaPlayer1.URL = mediaList[lb1.SelectedIndex].FullName;
否则没有数据源,您需要将Items
强制转换回FileItem
并使用FullName来获取原始的完整路径名称:
FileItem fil = (FileItem) lb1.Items[lb1.SelectedIndex];
axWindowsMediaPlayer1.URL = fil.FullName;
// or
axWindowsMediaPlayer1.URL = ((FileItem)lb1.SelectedItem).FullName;