Puedes usar 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;
Sin embargo, si la operación de hash es realmente larga (MSDN define esto como más de 2-7 segundos), probablemente debería usar un indicador de retroalimentación visual que no sea el cursor para notificar al usuario sobre el progreso. Para un conjunto más profundo de pautas, vea este artículo .
Editar:
como señaló @Am, es posible que deba llamar Application.DoEvents();
después Cursor.Current = Cursors.WaitCursor;
para asegurarse de que realmente se muestre el reloj de arena.
Application.UseWaitCursor = true
yApplication.UseWaitCursor = false
Realmente,
establece temporalmente el cursor de espera, pero no garantiza que se muestre hasta el final de su operación. Otros programas o controles dentro de su programa pueden restablecer fácilmente el cursor a la flecha predeterminada, como sucede de hecho cuando mueve el mouse mientras la operación aún se está ejecutando.
Una forma mucho mejor de mostrar el cursor de espera es establecer la propiedad UseWaitCursor en un formulario en verdadero:
Esto mostrará el cursor de espera para todos los controles en el formulario hasta que establezca esta propiedad en falso. Si desea que se muestre el cursor de espera en el nivel de Aplicación, debe usar:
fuente
Partiendo de lo anterior, mi enfoque preferido (ya que esta es una acción que se realiza con frecuencia) es envolver el código del cursor de espera en una clase auxiliar IDisposable para que pueda usarse con el uso () (una línea de código), tomar parámetros opcionales, ejecutar el código dentro, luego limpiar (restaurar el cursor) después.
Uso:
fuente
Es más fácil usar UseWaitCursor a nivel de formulario o ventana. Un caso de uso típico puede verse a continuación:
Para una mejor experiencia de UI, debe usar Asynchrony desde un hilo diferente.
fuente
Mi enfoque sería hacer todos los cálculos en un trabajador de fondo.
Luego cambia el cursor así:
Y en el evento de finalización del hilo, restaure el cursor:
Tenga en cuenta que esto también se puede hacer para controles específicos, por lo que el cursor será el reloj de arena solo cuando el mouse esté sobre ellos.
fuente
OK, así que creé un método asíncrono estático. Eso deshabilitó el control que inicia la acción y cambia el cursor de la aplicación. Ejecuta la acción como una tarea y espera a que termine. El control vuelve a la persona que llama mientras espera. Por lo tanto, la aplicación sigue respondiendo, incluso mientras el ícono ocupado gira.
Aquí está el código del formulario principal
Tuve que usar un registrador separado para la acción ficticia (estoy usando Nlog) y mi registrador principal está escribiendo en la interfaz de usuario (un cuadro de texto enriquecido). No pude mostrar el cursor ocupado solo cuando estaba sobre un contenedor particular en el formulario (pero no lo intenté mucho). Todos los controles tienen una propiedad UseWaitCursor, pero no parece tener ningún efecto en los controles Lo intenté (¿tal vez porque no estaban arriba?)
Aquí está el registro principal, que muestra las cosas que suceden en el orden que esperamos:
fuente
Con la clase a continuación puede hacer la sugerencia de Donut "excepción segura".
la clase CursorHandler
fuente
Okey, la opinión de otras personas es muy clara, pero me gustaría agregar algunas, como sigue:
fuente
Para las aplicaciones de Windows Forms, una desactivación opcional de un UI-Control puede ser muy útil. Entonces mi sugerencia se ve así:
Uso:
fuente
Use esto con WPF:
fuente