2010-06-28 11 views
13

WinForm'da bir UI ile programımda. ThreadPool'da bir yöntemi başlatmak için önce imleci bir kum saatine ayarladım. imleci ayarlamak için UI iş parçacığı içindeBir WinForm uygulamasında kum saati problemi

Benim kod şöyle görünür:

yöntemi bittikten
Application.UseWaitCursor = true; 

i Normal durumda imleci ayarlamak için UI Konuya geri dön.

Application.UseWaitCursor = false; 

Sorunum, imlecin fareyi hareket ettirmediği kadar Kum Saati'ne kalmasıdır. Kullanıcı fareyi hareket ettirmeden eylemin sonunda beklerse biraz rahatsız edici olur.

Herkes bana yardım edebilir mi?

Jérôme

cevap

6

Bu davranışı yeniden oluşturamıyorum? Benim için iyi çalışıyor. Eğer Control.Cursor = Cursors.WaitCursor yaklaşımı kullanırsanız genellikle şöyle kullanılan olsa

Unutulmaması gereken bir şey: görünür

this.Cursor = Cursors.WaitCursor

ancak ince çalışmak this formu anlamına gelir, kullanıcı hareket ederse o kadar Fare, farklı bir kontrol, örneğin bir TextBox sonra fare imleci beklemez.

Bu, kullanıcılar için karışıklığa neden olabilir. Ya da Uygulama başka bir iş yapmakla meşgulken kullanıcı başka bir şey üzerinde çalışmaya devam ederse bazı sorunlara neden olabilir.

+1

Sonunda Application.UseWaitCursor yerine Ana formundaki imleç özelliği değiştirildi ve imlecimin davranışı beklediğim şeydir. Sorunun ne olduğu hakkında hiçbir fikrim yok ... – RedPaladin

0

elle imleci ayarlayın. İşte bu yaptığım şey.

+0

Bunu nasıl yapabilirsiniz? – RedPaladin

+0

'control.Cursor = Cursors.Busy' – leppie

+0

Bence control.Cursor = Cursors.WaitCursor' – codingbadger

12

Bir daha yolu:

Cursor.Current = Cursors.Default; 
13

Aslında bunu yapmak için bir yol daha var, ben araştırma saat sonra bir yere bulundu: Bittiğinde

Cursor.Current = Cursors.WaitCursor; 

, sadece geri imleci değiştirmek bu sorun.

Maalesef bu bir saldırıdır.

Aşağıda yazdığım, sorunu ele alan bir yöntem.

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

En yararlı ipucu için teşekkürler. Aslında Cursor.Position = Cursor.Position; eklemek için yeterliydi. – jing