我曾在Borland的Turbo c++环境中看到过这一点,但我不确定如何在我正在开发的c#应用程序中实现这一点。是否有最佳实践或陷阱需要注意?


当前回答

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

当DragEnter事件触发时,将参数的allowedeeffect设置为非none的值(例如e.c effect = DragDropEffects.Move)。

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

其他回答

这是我用来放置文件和/或文件夹充满文件的东西。在我的例子中,我过滤的是*。DWG文件,并选择包括所有子文件夹。

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);
    }
  }

另一个常见的陷阱是认为你可以忽略表单DragOver(或DragEnter)事件。我通常使用表单的DragOver事件来设置allowedeeffect,然后使用特定控件的DragDrop事件来处理已删除的数据。

注意windows vista/windows 7的安全权限——如果你以管理员身份运行Visual Studio,当你在Visual Studio中运行程序时,你将不能将文件从非管理员资源管理器窗口拖到程序中。拖相关事件甚至不会火!

注意,为了实现这一点,你还需要在_drawEnter…中设置dragDropEffect。

private void Form1_DragEnter(object sender, DragEventArgs e)
{
    Console.WriteLine("DragEnter!");
    e.Effect = DragDropEffects.Copy;
}

来源:在c# Winforms应用程序中拖放不工作

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