2010-06-28 4 views
13

In meinem Programm mit einer Benutzeroberfläche in WinForm. Ich setze den Cursor kurz zuvor auf eine Sanduhr, um eine Methode in ThreadPool zu starten.Sanduhr-Problem in einer WinForm-Anwendung

in UI-Thread Mein Code, um den Cursor zu setzen wie folgt aussieht:

Application.UseWaitCursor = true; 

Wenn das Verfahren abgeschlossen ist, gehe ich zu dem UI-Thread zurück, um den Cursor auf den Normalfall einzustellen.

Mein Problem ist der Cursor bleibt auf der Sanduhr, bis ich die Maus nicht bewegen. Es ist ein wenig störend, wenn der Benutzer am Ende der Aktion wartet, ohne die Maus zu bewegen.

Jeder kann mir helfen?

Jérôme

Antwort

6

Ich kann dieses Verhalten nicht reproduzieren? Es funktioniert gut für mich.

Eine Sache zu beachten, obwohl, wenn Sie den Control.Cursor = Cursors.WaitCursor Ansatz verwenden, ist, dass es in der Regel, wie so verwendet:

this.Cursor = Cursors.WaitCursor

Welche erscheinen würde jedoch funktionieren, this die Form bezieht sich also, wenn sich der Benutzer bewegt die Maus zu einem anderen Steuerelement, zB einem TextBox, dann zeigt die Maus nicht den Wartecursor.

Dies kann zu Verwirrung für die Benutzer führen. Oder es können einige Probleme auftreten, wenn der Benutzer weiterhin an etwas anderem arbeitet, während die Anwendung andere Arbeiten ausführt.

+1

Endlich habe ich die Cursor-Eigenschaft auf dem Hauptformular anstelle von Application.UseWaitCursor geändert und das Verhalten meines Cursors ist, was ich erwartet habe. Ich habe keine Ahnung, woher das Problem kommt ... – RedPaladin

0

Den Cursor manuell einstellen. Das ist, was ich tue.

+0

Wie können Sie das tun? – RedPaladin

+0

'control.Cursor = Cursor.Busy' – leppie

+0

Ich denke, es sollte' control.Cursor = Cursors.WaitCursor' sein – codingbadger

12

Eine weitere Möglichkeit:

Cursor.Current = Cursors.Default; 
13

es ist mehr so, wie es zu tun Eigentlich, die ich irgendwo der Erforschung gefunden nach Stunden:

Cursor.Current = Cursors.WaitCursor; 

Wenn Sie fertig sind, nur den Cursor wieder ändern dieses Problem.

Leider ist es ein Hack.

Unten ist eine Methode, die ich geschrieben habe, die das Problem behandelt.

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

Danke für den nützlichsten Tipp. Eigentlich Cursor.Position = Cursor.Position; war genug für mich hinzuzufügen. – jing

Verwandte Themen