如何将文件拖放到应用程序中?
我已经在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); } }