2010-06-28 10 views
13

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

Il mio codice in thread UI per impostare il cursore si presenta così:

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. È un po 'inquietante se l'utente attende la fine dell'azione senza muovere il mouse.

Chiunque può aiutarmi?

Jérôme

risposta

6

Non riesco a 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

che sembrerebbe funzionare bene, tuttavia, this riferisce la forma, quindi se l'utente si muove il mouse su un controllo diverso, ad esempio un TextBox, quindi il mouse non mostra il cursore di attesa.

Ciò potrebbe causare confusione per gli utenti. Oppure potrebbe causare alcuni problemi se l'utente continua a lavorare su qualcos'altro quando l'applicazione è impegnata a svolgere altri compiti.

+1

Finalmente ho ha cambiato la proprietà Cursor sul form principale invece di Application.UseWaitCursor e il comportamento del mio cursore è quello che mi aspettavo. Non ho idea di quale sia il problema proveniente da ... – RedPaladin

0

Impostare il cursore manualmente. Questo è ciò che faccio.

+0

Come si può fare? – RedPaladin

+0

'control.Cursor = Cursors.Busy' – leppie

+0

Penso che dovrebbe essere' control.Cursor = Cursors.WaitCursor' – codingbadger

12

Un altro modo:

Cursor.Current = Cursors.WaitCursor; 

Al termine, basta cambiare il cursore indietro:

Cursor.Current = Cursors.Default; 
13

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

Sfortunatamente, è un hack.

Di seguito è 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; 
    } 
+0

Grazie per il suggerimento più utile. In realtà Cursor.Position = Cursor.Position; è stato abbastanza per me da aggiungere. – jing