2010-06-28 15 views
13

W moim programie z interfejsem użytkownika w WinForm. Ustawiłem kursor na klepsydrę tuż przed uruchomieniem metody w ThreadPool.Problem klepsydry w aplikacji WinForm

Mój kod w wątku UI, aby ustawić kursor wygląda następująco:

Application.UseWaitCursor = true; 

Gdy metoda jest zakończona, i wrócić do UI wątek, aby ustawić kursor w normalnym przypadku.

Application.UseWaitCursor = false; 

Mój problem polega na tym, że kursor pozostaje w klepsydrze, dopóki nie poruszę myszką. To trochę niepokojące, jeśli użytkownik czeka na koniec akcji bez poruszania myszą.

Ktoś może mi pomóc?

Jérôme

Odpowiedz

6

Nie mogę odtworzyć tego zachowania? Działa to dobrze dla mnie.

Jedną rzeczą, aby pamiętać, iż w przypadku korzystania z podejścia Control.Cursor = Cursors.WaitCursor jest to, że zwykle używany tak:

this.Cursor = Cursors.WaitCursor

Które wydaje się działać prawidłowo, jednak this odnosi formę więc jeśli ruchów użytkownika mysz do innej kontrolki, np. TextBox, wtedy mysz nie pokazuje kursora oczekiwania.

Może to powodować zamieszanie u użytkowników. Lub może powodować pewne problemy, jeśli użytkownik nadal pracuje nad czymś innym, gdy aplikacja jest zajęta wykonywaniem innych prac.

+1

W końcu mam zmieniono właściwość Cursor na głównym formularzu zamiast Application.UseWaitCursor, a zachowanie mojego kursora jest tym, czego oczekiwałem. Nie mam pojęcia, skąd się bierze problem ... – RedPaladin

0

Ustaw kursor ręcznie. To jest to co robię.

+0

Jak możesz to zrobić? – RedPaladin

+0

'control.Cursor = Cursors.Busy' – leppie

+0

Myślę, że powinno to być' control.Cursor = Cursors.WaitCursor' – codingbadger

12

Jeszcze jeden sposób:

Cursor.Current = Cursors.WaitCursor; 

Po zakończeniu wystarczy zmienić kursor:

Cursor.Current = Cursors.Default; 
13

Faktycznie, istnieje jeszcze jeden sposób na to, co znalazłem gdzieś po wielu godzinach poszukiwania ten problem.

Niestety, jest to hack.

Poniżej znajduje się napisana przeze mnie metoda, która rozwiązuje problem.

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

Dzięki za najbardziej przydatną wskazówkę. Właściwie Cursor.Position = Cursor.Position; wystarczyło mi dodać. – jing

Powiązane problemy