2010-06-28 4 views
13

Dans mon programme avec une interface utilisateur dans WinForm. J'ai placé le curseur sur un sablier juste avant de lancer une méthode dans ThreadPool.Problème de sablier dans une application WinForm

Mon code thread d'interface utilisateur pour placer le curseur ressemble à ceci:

Application.UseWaitCursor = true; 

Lorsque la méthode est terminée, je vais revenir à l'interface utilisateur filetage pour régler le curseur sur le cas normal.

Application.UseWaitCursor = false; 

Mon problème est que le curseur reste sur le sablier jusqu'à ce que je ne bouge plus la souris. C'est un peu dérangeant si l'utilisateur attend à la fin de l'action sans bouger la souris.

Quelqu'un peut-il m'aider?

Jérôme

Répondre

6

Je n'arrive pas à reproduire ce comportement? Ça fonctionne bien pour moi.

Une chose à noter que si vous utilisez l'approche Control.Cursor = Cursors.WaitCursor est qu'il utilise généralement comme ceci:

this.Cursor = Cursors.WaitCursor

qui semble fonctionner très bien, cependant, this renvoie la forme si l'utilisateur se déplace la souris à un contrôle différent, par exemple un TextBox alors la souris n'affiche pas le curseur d'attente.

Ceci peut causer de la confusion pour les utilisateurs. Ou pourrait causer quelques problèmes si l'utilisateur continue de travailler sur autre chose lorsque l'application est occupée à faire un autre travail.

+1

Enfin, j'ai changé la propriété Cursor sur le formulaire principal au lieu de Application.UseWaitCursor et le comportement de mon curseur est ce que j'ai attendu. Je n'ai aucune idée de ce que le problème vient de ... – RedPaladin

0

Définissez le curseur manuellement. C'est ce que je fais.

+0

Comment pouvez-vous faire cela? – RedPaladin

+0

'control.Cursor = Cursors.Busy' – leppie

+0

Je pense qu'il devrait être' control.Cursor = Cursors.WaitCursor' – codingbadger

12

Une autre façon:

Cursor.Current = Cursors.WaitCursor; 

Lorsque vous avez terminé, il suffit de changer le curseur:

Cursor.Current = Cursors.Default; 
13

En fait, il y a une autre façon de le faire, que je trouvais quelque part après les heures de recherche ce problème.

Malheureusement, c'est un hack.

Voici une méthode que j'ai écrite qui gère le problème.

/// <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

Merci pour le conseil le plus utile. En fait Cursor.Position = Cursor.Position; était assez pour moi d'ajouter. – jing

Questions connexes