Anda bisa menggunakannya Cursor.Current
.
// Set cursor as hourglass
Cursor.Current = Cursors.WaitCursor;
// Execute your time-intensive hashing code here...
// Set cursor as default arrow
Cursor.Current = Cursors.Default;
Namun, jika operasi hashing benar - benar panjang (MSDN mendefinisikan ini lebih dari 2-7 detik), Anda mungkin harus menggunakan indikator umpan balik visual selain kursor untuk memberi tahu pengguna tentang kemajuan. Untuk seperangkat pedoman yang lebih mendalam, lihat artikel ini .
Sunting:
Seperti yang ditunjukkan @Am, Anda mungkin perlu menelepon Application.DoEvents();
setelah Cursor.Current = Cursors.WaitCursor;
untuk memastikan bahwa jam pasir benar-benar ditampilkan.
Application.UseWaitCursor = true
danApplication.UseWaitCursor = false
Sebenarnya,
tentukan sementara kursor Tunggu, tetapi tidak memastikan bahwa kursor Tunggu muncul hingga akhir operasi Anda. Program atau kontrol lain dalam program Anda dapat dengan mudah mengatur ulang kursor kembali ke panah default seperti yang sebenarnya terjadi ketika Anda menggerakkan mouse saat operasi masih berjalan.
Cara yang jauh lebih baik untuk menampilkan kursor Tunggu adalah dengan menyetel properti UseWaitCursor dalam bentuk menjadi true:
Ini akan menampilkan kursor tunggu untuk semua kontrol pada formulir sampai Anda menyetel properti ini menjadi false. Jika Anda ingin menunggu kursor ditampilkan pada level Aplikasi, Anda harus menggunakan:
sumber
Membangun sebelumnya, pendekatan yang saya pilih (karena ini adalah tindakan yang sering dilakukan) adalah untuk membungkus kode kursor tunggu dalam kelas pembantu IDisposable sehingga dapat digunakan dengan menggunakan () (satu baris kode), ambil parameter opsional, jalankan kode di dalamnya, lalu bersihkan (restore cursor) sesudahnya.
Pemakaian:
sumber
Lebih mudah untuk menggunakan UseWaitCursor di tingkat Form atau Window. Kasus penggunaan umum dapat terlihat seperti di bawah ini:
Untuk pengalaman UI yang lebih baik, Anda harus menggunakan Asynchrony dari utas yang berbeda.
sumber
Pendekatan saya adalah membuat semua perhitungan di latar belakang pekerja.
Kemudian ubah kursor seperti ini:
Dan di acara selesai utas mengembalikan kursor:
Catatan, ini juga dapat dilakukan untuk kontrol tertentu, sehingga kursor akan menjadi jam pasir hanya ketika mouse berada di atasnya.
sumber
OK jadi saya membuat metode async statis. Itu menonaktifkan kontrol yang meluncurkan aksi dan mengubah kursor aplikasi. Itu menjalankan tindakan sebagai tugas dan menunggu untuk selesai. Kontrol kembali ke pemanggil saat menunggu. Jadi aplikasi tetap responsif, bahkan saat ikon sibuk berputar.
Berikut kode dari form utama
Saya harus menggunakan logger terpisah untuk aksi dummy (saya menggunakan Nlog) dan logger utama saya menulis ke UI (kotak teks kaya). Saya tidak bisa mendapatkan tampilan kursor yang sibuk hanya ketika melewati wadah tertentu pada formulir (tapi saya tidak berusaha sangat keras). Semua kontrol memiliki properti UseWaitCursor, tetapi tampaknya tidak berpengaruh pada kontrol Saya mencoba (mungkin karena mereka tidak di atas?)
Inilah log utama, yang menunjukkan hal-hal yang terjadi dalam urutan yang kami harapkan:
sumber
Dengan kelas di bawah ini Anda dapat membuat saran dari Donut "pengecualian aman".
CursorHandler kelas
sumber
Okey, pandangan orang lain sangat jelas, tetapi saya ingin menambahkan, sebagai berikut:
sumber
Untuk aplikasi Windows Forms, penonaktifan opsional UI-Control bisa sangat berguna. Jadi saran saya terlihat seperti ini:
Pemakaian:
sumber
Gunakan ini dengan WPF:
sumber