Ich habe dies in Borlands Turbo C ++ - Umgebung gesehen, bin mir aber nicht sicher, wie ich es für eine C # -Anwendung tun soll, an der ich arbeite. Gibt es Best Practices oder Fallstricke, auf die Sie achten müssen?
c#
winforms
drag-and-drop
Uwe Keim
quelle
quelle
Antworten:
Einige Beispielcodes:
quelle
io.File
(string[])
Guss sicher fürFileDrop
formatierte Tropfen? Das heißt, ist es möglich, eine zu generierenFileDrop
, die eine illegale Besetzungsausnahme verursachtstring[]
? Ich habe Probleme, das aus den Dokumenten herauszufinden .Beachten Sie die Sicherheitsrechte von Windows Vista / Windows 7 - Wenn Sie Visual Studio als Administrator ausführen, können Sie keine Dateien aus einem Nicht-Administrator-Explorer-Fenster in Ihr Programm ziehen, wenn Sie es in Visual Studio ausführen. Die Drag-bezogenen Ereignisse werden nicht einmal ausgelöst! Ich hoffe, das hilft jemand anderem da draußen, keine Stunden seines Lebens zu verschwenden ...
quelle
Legen Sie in Windows Forms die AllowDrop-Eigenschaft des Steuerelements fest und warten Sie dann auf das DragEnter-Ereignis und das DragDrop-Ereignis.
Wenn das
DragEnter
Ereignis ausgelöst wird, setzen Sie das ArgumentAllowedEffect
auf etwas anderes als keines (ze.Effect = DragDropEffects.Move
. ).Wenn das
DragDrop
Ereignis ausgelöst wird, erhalten Sie eine Liste mit Zeichenfolgen. Jede Zeichenfolge ist der vollständige Pfad zu der Datei, die gelöscht wird.quelle
Sie müssen sich einer Gotcha bewusst sein. Jede Klasse, die Sie beim Ziehen / Ablegen als DataObject weitergeben , muss serialisierbar sein. Wenn Sie also versuchen, ein Objekt zu übergeben, und es nicht funktioniert, stellen Sie sicher, dass es serialisiert werden kann, da dies mit ziemlicher Sicherheit das Problem ist. Das hat mich ein paar Mal erwischt!
quelle
Noch ein Gotcha:
Der Framework-Code, der die Drag-Ereignisse aufruft, verschluckt alle Ausnahmen. Sie könnten denken, Ihr Ereigniscode läuft reibungslos, während es überall Ausnahmen gibt. Sie können sie nicht sehen, weil das Framework sie stiehlt.
Deshalb habe ich in diesen Event-Handlern immer einen Versuch / Fang gemacht, nur damit ich weiß, ob sie Ausnahmen auslösen. Normalerweise setze ich einen Debugger.Break (); im Fangteil.
Vor der Veröffentlichung, nach dem Testen, wenn sich alles zu verhalten scheint, entferne oder ersetze ich diese durch echte Ausnahmebehandlung.
quelle
Ein weiteres häufiges Problem ist, dass Sie die Ereignisse Form DragOver (oder DragEnter) ignorieren können. Normalerweise verwende ich das DragOver-Ereignis des Formulars, um den AllowedEffect festzulegen, und dann das DragDrop-Ereignis eines bestimmten Steuerelements, um die abgelegten Daten zu verarbeiten.
quelle
Hier ist etwas, das ich verwendet habe, um Dateien und / oder Ordner voller Dateien abzulegen. In meinem Fall habe ich nur nach
*.dwg
Dateien gefiltert und alle Unterordner eingeschlossen.fileList
ist einIEnumerable
oder ähnliches In meinem Fall war an eine WPF-Kontrolle gebunden ...Siehe https://stackoverflow.com/a/19954958/492 Informationen zu diesem Trick finden .
Der Drop-Handler ...
quelle
Die Lösung von Judah Himango und Hans Passant ist im Designer verfügbar (ich verwende derzeit VS2015):
quelle
Sie können Drag & Drop in WinForms und WPF implementieren.
Sie sollten ein Mausbewegungsereignis hinzufügen:
Sie sollten das DragDrop-Ereignis hinzufügen:
private void YourElementControl_DragDrop (Objektabsender, DragEventArgs e)
Quelle mit vollständigem Code .
quelle