Domanda

Nel mio programma con un'interfaccia utente in WinForm. Ho impostato il cursore su una clessidra appena prima di lanciare un metodo ThreadPool.

Il mio codice in thread UI per impostare l'aspetto del cursore in questo modo:

Application.UseWaitCursor = true;

Quando il metodo è finita, torno al thread UI per impostare il cursore sul caso normale.

Application.UseWaitCursor = false;

Il mio problema è il soggiorno cursore sulla clessidra finché non mi muovo il mouse. E 'un po' inquietante se l'utente attesa sulla fine dell'azione senza muovere il mouse.

Chiunque può aiutarmi?

Jérôme

È stato utile?

Soluzione

Non sono in grado di riprodurre questo comportamento? Funziona bene per me.

Una cosa da notare però, se si utilizza l'approccio Control.Cursor = Cursors.WaitCursor è che di solito usato in questo modo:

this.Cursor = Cursors.WaitCursor

Il che sembrano funzionare bene, tuttavia, si riferisce this forma quindi se l'utente sposta il mouse per un controllo diverso, per esempio una TextBox poi il mouse non mostra il cursore di attesa.

Questo può causare confusione per gli utenti. O potrebbe causare alcuni problemi se l'utente continua a lavorare su qualcosa di diverso quando l'applicazione è occupato a fare altri lavori.

Altri suggerimenti

In realtà, c'è un altro modo per farlo, che ho trovato da qualche parte dopo ore di ricerca di questo problema.

Purtroppo, si tratta di un hack.

Di seguito è riportato un metodo che ho scritto che gestisce il 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;
    }

Un altro modo:

Cursor.Current = Cursors.WaitCursor;

Al termine, basta cambiare la parte posteriore del cursore:

Cursor.Current = Cursors.Default;

Imposta manualmente il cursore. Questo è quello che faccio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top