Pertanyaan saya adalah 2 kali lipat, dan saya berharap ada solusi yang lebih mudah untuk keduanya disediakan oleh WPF daripada solusi standar dari WinForms (yang disediakan Christophe Geers, sebelum saya membuat klarifikasi ini).
Pertama, adakah cara untuk membuat Window dapat diseret tanpa menangkap dan memproses peristiwa klik-mouse + seret? Maksud saya, jendela dapat diseret oleh bilah judul, tetapi jika saya mengatur jendela agar tidak memilikinya dan masih ingin dapat menyeretnya, apakah ada cara untuk mengarahkan ulang peristiwa entah bagaimana ke apa pun yang menangani bilah judul menyeret ?
Kedua, apakah ada cara untuk menerapkan event handler ke semua elemen di jendela? Seperti, buat jendela bisa diseret apa pun elemen yang diklik + diseret pengguna. Jelas tanpa menambahkan handler secara manual, ke setiap elemen. Lakukan saja sekali di suatu tempat?
sumber
MouseLeftButtonDown
acara saja, daripada memeriksa di .cs?MouseLeftButtonDown
memiliki strategi perutean langsung sementaraMouseDown
memiliki strategi perutean yang menggelegak. Lihat bagian komentar dari halaman MSDN untuk MouseLeftButtonDown untuk info lebih lanjut, dan untuk beberapa hal-hal ekstra yang harus diperhatikan jika Anda akan menggunakanMouseLeftButtonDown
lebihMouseDown
.jika formulir wpf harus dapat diseret di mana pun ia diklik, penyelesaian yang mudah adalah menggunakan delegasi untuk memicu metode DragMove () baik pada peristiwa onload windows atau peristiwa pemuatan grid
sumber
DragMove
hanya dapat dipanggil saat tombol utama mouse tidak aktif .Terkadang, kita tidak memiliki akses ke
Window
, misalnya jika kita menggunakanDevExpress
, yang tersedia hanyalah aUIElement
.Langkah 1: Tambahkan properti terlampir
Solusinya adalah:
MouseMove
acara;Window
;.DragMove()
kami yang baru ditemukanWindow
.Kode:
Langkah 2: Tambahkan Properti Terlampir ke elemen apa pun untuk membiarkannya menyeret jendela
Pengguna dapat menyeret seluruh jendela dengan mengklik elemen tertentu, jika kita menambahkan properti terlampir ini:
Lampiran A: Contoh Lanjutan Opsional
Dalam contoh dari DevExpress ini , kami mengganti bilah judul jendela dok dengan persegi panjang abu-abu kami sendiri, lalu memastikan bahwa jika pengguna mengeklik dan menyeret persegi abu-abu tersebut, jendela akan menyeret secara normal:
Penafian: Saya tidak berafiliasi dengan DevExpress . Teknik ini akan bekerja dengan elemen pengguna apa pun, termasuk WPF standar atau Telerik (penyedia perpustakaan WPF bagus lainnya).
sumber
Melempar pengecualian dalam beberapa kasus (yaitu jika di jendela Anda juga memiliki gambar yang dapat diklik yang ketika diklik membuka kotak pesan. Ketika Anda keluar dari kotak pesan, Anda akan mendapatkan kesalahan) Lebih aman untuk digunakan
Jadi Anda yakin tombol kiri ditekan pada saat itu.
sumber
e.LeftButton
alih-alihMouse.LeftButton
secara khusus menggunakan tombol yang terkait dengan acara args, meskipun itu mungkin tidak masalah.Anda dapat menyeret & menjatuhkan formulir dengan mengklik di mana saja pada formulir, bukan hanya bilah judul. Ini berguna jika Anda memiliki formulir tanpa bingkai.
Artikel di CodeProject ini menunjukkan satu kemungkinan solusi untuk menerapkan ini:
http://www.codeproject.com/KB/cs/DraggableForm.aspx
Pada dasarnya turunan dari tipe Formulir dibuat di mana peristiwa mouse turun, naik dan pindah ditangani.
Dan inilah solusi serupa yang dijelaskan dalam tutorial video:
http://www.youtube.com/watch?v=tJlY9aX73Vs
Saya tidak akan mengizinkan menyeret formulir saat pengguna mengklik kontrol dalam formulir tersebut. Pengguna memberikan hasil yang berbeda ketika mereka mengklik kontrol yang berbeda. Ketika formulir saya tiba-tiba mulai bergerak karena saya mengklik kotak daftar, tombol, label ... dll. itu akan membingungkan.
sumber
Seperti yang telah disebutkan oleh @ fjch1997, lebih mudah menerapkan perilaku. Ini dia, logika inti adalah sama seperti di @ loi.efy ini jawabannya :
Pemakaian:
sumber
Ini semua dibutuhkan!
sumber
Metode yang paling berguna, baik untuk bentuk WPF dan windows, contoh WPF:
sumber
sumber
sumber