c# - 拖曳視窗 - 如何將文件拖放到應用程序中?




windows form拖拉 (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事件觸發時,你會得到一個字符串列表。 每個字符串都是要刪除的文件的完整路徑。


這是我用來刪除文件和/或文件夾的東西。 在我的情況下,我只是篩選*.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-events的框架代碼吞下所有異常。 你可能會認為你的事件代碼運行的很順利,而它正在遍地都是異常的。 你看不到它們是因為框架竊取了它們。

這就是為什麼我總是在這些事件處理程序中加入try / catch,只是讓我知道他們是否拋出任何異常。 我通常把一個Debugger.Break(); 在捕捉部分。

在發布之前,測試之後,如果一切似乎都行動起來,我會刪除或用真正的異常處理來替換它們。





drag-and-drop