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




winforms drag-and-drop (6)

Judah Himango和Hans Passant的解决方案可以在Designer中使用(我目前使用VS2015):

我已经在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);
    }
  }

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


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

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

DragDrop事件触发时,你会得到一个字符串列表。 每个字符串都是要删除的文件的完整路径。


还有一个难题:

调用Drag-events的框架代码吞下所有异常。 你可能会认为你的事件代码运行的很顺利,而它正在遍地都是异常的。 你看不到它们是因为框架窃取了它们。

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

在发布之前,测试之后,如果一切似乎都行动起来,我会删除或用真正的异常处理来替换它们。


这是我用来删除文件和/或文件夹的东西。 在我的情况下,我只是筛选*.dwg文件,并选择包含所有子文件夹。

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

var fileList = (IList)FileList.ItemsSource;

有关该技巧的详细信息,请参阅https://.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);
    }
  }




drag-and-drop