2010-06-28 40 views
13

在我的程序中使用WinForm中的UI。我在之前將遊標設置爲一個沙漏來在ThreadPool中啓動一個方法。WinForm應用程序中的沙漏問題

我在UI線程代碼來設置光標看起來是這樣的:

Application.UseWaitCursor = true; 

當方法結束後,我回到UI線程設置光標到正常情況。

Application.UseWaitCursor = false; 

我的問題是遊標停留在沙漏,直到我不移動鼠標。如果用戶在不移動鼠標的情況下等待操作結束,這有點令人不安。

任何人都可以幫到我嗎?

Jérôme

回答

6

我無法重現此行爲?這對我來說可以。需要注意的

但有一件事,如果你使用Control.Cursor = Cursors.WaitCursor的做法是,它通常用於像這樣:

this.Cursor = Cursors.WaitCursor

會出現哪些工作正常,但是,this指形式,所以如果用戶移動將鼠標指向不同的控件,例如文本框,然後鼠標不顯示等待光標。

這可能會導致用戶混淆。或者,如果用戶在忙於其他工作時繼續處理其他事情,則可能會導致一些問題。

+1

最後我有改變了主Form上的Cursor屬性而不是Application.UseWaitCursor,我的遊標行爲就是我所期望的。我不知道問題是從哪裏來的... – RedPaladin 2010-06-28 07:49:28

0

手動設置光標。我就是做這個的。

+0

你怎麼能做到這一點? – RedPaladin 2010-06-28 07:23:39

+0

'control.Cursor = Cursors.Busy' – leppie 2010-06-28 07:24:28

+0

我認爲它應該是'control.Cursor = Cursors.WaitCursor' – codingbadger 2010-06-28 07:28:18

12

另一種方式:

Cursor.Current = Cursors.WaitCursor; 

完成後,只需更改回光標:

Cursor.Current = Cursors.Default; 
13

其實,有做的另一種方式,這是我研究了幾個小時之後發現某處這個問題。

不幸的是,它是一個黑客。

下面是我寫的處理問題的方法。

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

感謝您提供最有用的提示。實際上Cursor.Position = Cursor.Position;足以讓我補充。 – jing 2013-01-16 13:19:11