Come trascino i file in un’applicazione?

Ho visto questo fatto nell’ambiente Turbo C ++ di Borland, ma non sono sicuro di come farlo per un’applicazione C # su cui sto lavorando. Ci sono buone pratiche o trucchi da tenere d’occhio?

Alcuni esempi di codice:

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

Siate consapevoli dei diritti di sicurezza di Windows Vista / Windows 7: se state eseguendo Visual Studio come amministratore, non sarete in grado di trascinare i file da una finestra di Explorer non amministratore nel vostro programma quando lo eseguite da Visual Studio. Gli eventi relativi al trascinamento non spareranno nemmeno! Spero che questo aiuti qualcun altro là fuori non sprecare ore della loro vita …

In Windows Forms, imposta la proprietà AllowDrop del controllo, quindi ascolta gli eventi DragEnter e DragDrop.

Quando viene DragEnter evento DragEnter , imposta AllowedEffect su un argomento diverso da none (ad es. e.Effect = DragDropEffects.Move ).

Quando viene DragDrop evento DragDrop , riceverai un elenco di stringhe. Ogni stringa rappresenta il percorso completo del file che viene eliminato.

Devi essere consapevole di un trucco. Qualsiasi class passata come DataObject nell’operazione di trascinamento della selezione deve essere serializzabile. Quindi, se provi a passare un object e non funziona, assicurati che possa essere serializzato in quanto è quasi certamente il problema. Questo mi ha sorpreso un paio di volte!

Ancora un altro trucchetto:

Il codice framework che chiama Drag-Events ingoia tutte le eccezioni. Potresti pensare che il tuo codice di evento funzioni senza intoppi, mentre si stanno scatenando eccezioni ovunque. Non puoi vederli perché il framework li ruba.

Questo è il motivo per cui provo sempre a catturare questi gestori di eventi, quindi so se generano eccezioni. Di solito metto un Debugger.Break (); nella parte catch.

Prima del rilascio, dopo il test, se tutto sembra funzionare, rimuoverò o sostituirò questi con una gestione delle eccezioni reale.

Un altro trucco comune è pensare di poter ignorare gli eventi Form DragOver (o DragEnter). Generalmente utilizzo l’evento DragOver di Form per impostare AllowEffect e quindi l’evento DragDrop di un controllo specifico per gestire i dati rilasciati.

Ecco qualcosa che ho usato per rilasciare file e / o cartelle piene di file. Nel mio caso stavo filtrando solo per *.dwg file *.dwg e ho scelto di includere tutte le sottocartelle.

fileList è un object IEnumerable o simile Nel mio caso era associato a un controllo WPF …

 var fileList = (IList)FileList.ItemsSource; 

Vedi https://stackoverflow.com/a/19954958/492 per i dettagli di quel trucco.

Il gestore di interruzioni …

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

La soluzione di Judah Himango e Hans Passant è disponibile nel Designer (attualmente sto utilizzando VS2015): inserisci la descrizione dell'immagine qui inserisci la descrizione dell'immagine qui