如何将文件拖放到应用程序中?

我已经在Borland的Turbo C ++环境中看到了这一点,但是我不确定如何去处理我正在使用的C#应用​​程序。 是否有最佳做法或陷阱寻找?

一些示例代码:

public partial class Form1 : Form { public Form1() { InitializeComponent(); this.AllowDrop = true; this.DragEnter += new DragEventHandler(Form1_DragEnter); this.DragDrop += new DragEventHandler(Form1_DragDrop); } void Form1_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy; } void Form1_DragDrop(object sender, DragEventArgs e) { string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); foreach (string file in files) Console.WriteLine(file); } } 

注意Windows Vista / Windows 7的安全权限 – 如果您以pipe理员身份运行Visual Studio,则在Visual Studio中运行时,将无法将文件从非pipe理员资源pipe理器窗口拖到您的程序中。 拖动相关事件甚至不会发射! 我希望这可以帮助别人不浪费他们的生活时间…

在Windows窗体中,设置控件的AllowDrop属性,然后监听DragEnter事件和DragDrop事件。

DragEnter事件触发时,将参数的AllowedEffect设置AllowedEffect none(例如e.Effect = DragDropEffects.Move )。

DragDrop事件触发时,你会得到一个string列表。 每个string都是要删除的文件的完整path。

你需要知道一个问题。 任何在拖放操作中作为DataObject传递的类都必须是Serializable。 所以,如果你尝试传递一个对象,但它不能正常工作,确保它可以被序列化,因为这几乎是肯定的问题。 这让我抓了几次!

还有一个问题:

调用Drag-events的框架代码将吞服所有exception。 你可能会认为你的事件代码运行的很顺利,而且它在各处都会抛出exception。 你不能看到他们,因为框架窃取他们。

这就是为什么我总是在这些事件处理程序中join一个try / catch,所以我知道他们是否抛出exception。 我通常把一个Debugger.Break(); 在捕捉部分。

在发布之前,testing之后,如果一切似乎都行动起来,我将删除或replace为真正的exception处理。

另一个常见问题是认为你可以忽略Form DragOver(或DragEnter)事件。 我通常使用Form的DragOver事件设置AllowedEffect,然后使用特定控件的DragDrop事件来处理丢弃的数据。

这是我用来放置文件和/或文件夹的东西。 在我的情况下,我只筛选*.dwg文件,并select包括所有子文件夹。

fileList是一个IEnumerable或类似的在我的情况下绑定到一个WPF控件…

 var fileList = (IList)FileList.ItemsSource; 

有关该技巧的详细信息,请参阅https://stackoverflow.com/a/19954958/492

Drop Handler …

  private void FileList_OnDrop(object sender, DragEventArgs e) { var dropped = ((string[])e.Data.GetData(DataFormats.FileDrop)); var files = dropped.ToList(); if (!files.Any()) return; foreach (string drop in dropped) if (Directory.Exists(drop)) files.AddRange(Directory.GetFiles(drop, "*.dwg", SearchOption.AllDirectories)); foreach (string file in files) { if (!fileList.Contains(file) && file.ToLower().EndsWith(".dwg")) fileList.Add(file); } }