Saya telah melihat ini dilakukan di lingkungan Turbo C ++ Borland , tapi saya tidak yakin bagaimana melakukannya untuk aplikasi C # yang saya kerjakan. Apakah ada praktik terbaik atau tantangan yang harus diwaspadai?
c#
winforms
drag-and-drop
Uwe Keim
sumber
sumber
Jawaban:
Beberapa kode contoh:
sumber
io.File
(string[])
pemain aman untukFileDrop
drop yang diformat? Artinya, apakah mungkin untuk menghasilkanFileDrop
yang akan menyebabkan pengecualian pemain ilegalstring[]
? Saya mengalami kesulitan mencari tahu dari dokumen .Waspadai hak keamanan windows vista / windows 7 - jika Anda menjalankan Visual Studio sebagai administrator, Anda tidak akan dapat menyeret file dari jendela penjelajah non-administrator ke dalam program Anda ketika Anda menjalankannya dari dalam visual studio. Peristiwa terkait seret bahkan tidak akan menyala! Saya harap ini membantu orang lain di luar sana untuk tidak membuang-buang waktu hidup mereka ...
sumber
Di Windows Forms, setel properti AllowDrop kontrol, lalu dengarkan acara DragEnter dan acara DragDrop.
Ketika
DragEnter
acara menyala, atur argumenAllowedEffect
ke sesuatu selain yang tidak ada (mise.Effect = DragDropEffects.Move
.).Saat
DragDrop
acara dimulai, Anda akan mendapatkan daftar string. Setiap string adalah path lengkap ke file yang dijatuhkan.sumber
Anda harus menyadari gotcha. Setiap kelas yang Anda lewati sebagai DataObject dalam operasi seret / lepas harus Serializable. Jadi, jika Anda mencoba dan melewatkan objek, dan itu tidak berfungsi, pastikan itu dapat diserialisasi karena itu hampir pasti masalahnya. Ini telah menangkap saya beberapa kali!
sumber
Gotcha lainnya:
Kode kerangka kerja yang memanggil Drag-events menelan semua pengecualian. Anda mungkin berpikir kode acara Anda berjalan dengan lancar, sementara itu memunculkan pengecualian di semua tempat. Anda tidak dapat melihat mereka karena kerangka kerja mencuri mereka.
Itu sebabnya saya selalu mencoba / menangkap dalam event handler ini, hanya supaya saya tahu jika mereka memberikan pengecualian. Saya biasanya meletakkan Debugger.Break (); di bagian tangkapan.
Sebelum dirilis, setelah pengujian, jika semuanya tampak berperilaku, saya menghapus atau mengganti ini dengan penanganan pengecualian nyata.
sumber
Gotcha umum lainnya adalah berpikir Anda dapat mengabaikan acara Form DragOver (atau DragEnter). Saya biasanya menggunakan acara DragOver Formulir untuk mengatur DiizinkanEffect, dan kemudian acara DragDrop kontrol tertentu untuk menangani data yang dijatuhkan.
sumber
Ini adalah sesuatu yang saya gunakan untuk meletakkan file dan / atau folder yang penuh dengan file. Dalam kasus saya, saya memfilter
*.dwg
hanya untuk file dan memilih untuk memasukkan semua subfolder.fileList
adalahIEnumerable
atau serupa Dalam kasus saya terikat ke kontrol WPF ...Lihat https://stackoverflow.com/a/19954958/492 untuk detail trik itu.
Drop Handler ...
sumber
Solusi Judah Himango dan Hans Passant tersedia di Designer (Saya saat ini menggunakan VS2015):
sumber
Anda dapat menerapkan Drag & Drop di WinForms dan WPF.
Anda harus menambahkan acara mousemove:
Anda harus menambahkan acara DragDrop:
batal pribadi YourElementControl_DragDrop (pengirim objek, DragEventArgs e)
Sumber dengan kode lengkap .
sumber