Pregunta

En mi programa con una interfaz de usuario en WinForm. Me puse el cursor a un reloj de arena justo antes de poner en marcha un método en el ThreadPool.

Mi código en hilo de interfaz de usuario para configurar la apariencia del cursor como esta:

Application.UseWaitCursor = true;

Cuando el método es acabada, 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 perturbador un poco si la espera de usuario en el final de la acción sin mover el ratón.

Cualquiera puede ayudarme?

Jérôme

¿Fue útil?

Solución

Soy incapaz de reproducir este comportamiento? Funciona bien para mí.

Hay que destacar, aunque si se utiliza el enfoque Control.Cursor = Cursors.WaitCursor es que por lo general utiliza de esta manera:

this.Cursor = Cursors.WaitCursor

¿Qué le parece que funcionan bien, sin embargo, se refiere this forma por lo que si el usuario mueve el ratón para un control diferente, por ejemplo un cuadro de texto a continuación, el ratón 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á ocupado haciendo otros trabajos.

Otros consejos

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 de este problema.

Por desgracia, es un truco.

A continuación se muestra un método que escribí 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;
    }

Una forma más de:

Cursor.Current = Cursors.WaitCursor;

Cuando haya terminado, basta con cambiar la parte de atrás del cursor:

Cursor.Current = Cursors.Default;

Coloque el cursor manualmente. Eso es lo que hago.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top