2010-06-28 9 views
13

En mi programa con una interfaz de usuario en WinForm. Coloqué el cursor en un reloj de arena justo antes de abrir un método en ThreadPool.Problema de reloj de arena en una aplicación WinForm

Mi código en hilo de interfaz de usuario para configurar el cursor se ve así:

Application.UseWaitCursor = true; 

Cuando se termina el método, vuelvo al hilo de interfaz de usuario para colocar el cursor en el caso normal.

Application.UseWaitCursor = false; 

Mi problema es la estancia cursor al reloj de arena hasta que no mueva el ratón. Es un poco molesto si el usuario espera al final de la acción sin mover el mouse.

¿Alguien me puede ayudar?

Jérôme

Respuesta

6

No puedo reproducir este comportamiento? Funciona bien para mí.

Una cosa a tener en cuenta, aunque si se utiliza el enfoque Control.Cursor = Cursors.WaitCursor es que generalmente se usa de esta manera:

this.Cursor = Cursors.WaitCursor

que aparecería para trabajar bien, sin embargo, this se refiere el formulario por lo que si el usuario se mueve el mouse a un control diferente, por ejemplo, un TextBox, luego el mouse no muestra el cursor de espera.

Esto puede causar confusión entre los usuarios. O podría causar algunos problemas si el usuario continúa trabajando en otra cosa cuando la aplicación está ocupada haciendo otro trabajo.

+1

Finalmente tengo Cambié la Propiedad del Cursor en el Formulario principal en lugar de Application.UseWaitCursor y el comportamiento de mi cursor es lo que esperaba. No tengo idea de qué viene el problema ... – RedPaladin

0

Coloque el cursor manualmente. Eso es lo que hago.

+0

¿Cómo se puede hacer esto? – RedPaladin

+0

'control.Cursor = Cursors.Busy' – leppie

+0

Creo que debería ser' control.Cursor = Cursors.WaitCursor' – codingbadger

12

una forma más:

Cursor.Current = Cursors.WaitCursor; 

Cuando haya terminado, sólo cambia el cursor hacia atrás:

Cursor.Current = Cursors.Default; 
13

En realidad, no es una forma más de hacerlo, lo que he encontrado en algún lugar después de horas de investigación este problema.

Lamentablemente, es un truco.

A continuación se muestra un método que he escrito que maneja el problema.

/// <summary> 
    /// Call to toggle between the current cursor and the wait cursor 
    /// </summary> 
    /// <param name="control">The calling control.</param> 
    /// <param name="toggleWaitCursorOn">True for wait cursor, false for default.</param> 
    public static void UseWaitCursor(this Control control, bool toggleWaitCursorOn) 
    { 
     ... 

     control.UseWaitCursor = toggleWaitCursorOn; 

     // Because of a weird quirk in .NET, just setting UseWaitCursor to false does not work 
     // until the cursor's position changes. The following line of code fakes that and 
     // effectively forces the cursor to switch back from the wait cursor to default. 
     if (!toggleWaitCursorOn) 
      Cursor.Position = Cursor.Position; 
    } 
+0

Gracias por el consejo más útil. En realidad Cursor.Position = Cursor.Position; fue suficiente para agregar. – jing

Cuestiones relacionadas