WinForm应用程序中的沙漏问题

时间:2010-06-28 07:17:13

标签: c# winforms user-interface hourglass

在我的WinForm中使用UI的程序中。我将光标设置为在ThreadPool中启动方法之前的沙漏。

我在UI线程中设置光标的代码如下所示:

Application.UseWaitCursor = true;

当方法完成后,我回到UI线程将光标设置为正常情况。

Application.UseWaitCursor = false;

我的问题是光标停留在沙漏上,直到我不移动鼠标。如果用户在不移动鼠标的情况下等待操作结束,则会有点令人不安。

任何人都可以帮助我?

杰罗姆

5 个答案:

答案 0 :(得分:14)

实际上,还有一种方法可以做到这一点,我在经过几个小时的研究后发现了这个问题。

不幸的是,这是一个黑客攻击。

以下是我编写的处理问题的方法。

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

答案 1 :(得分:13)

还有一种方法:

Cursor.Current = Cursors.WaitCursor;

完成后,只需将光标改回:

Cursor.Current = Cursors.Default;

答案 2 :(得分:6)

我无法重现此行为?它对我来说很好。

有一点需要注意,如果你使用Control.Cursor = Cursors.WaitCursor方法,它通常会像这样使用:

this.Cursor = Cursors.WaitCursor

这似乎工作正常,但是,this引用表单,因此如果用户将鼠标移动到不同的控件,例如TextBox,则鼠标不会显示等待光标。

这可能会导致用户混淆。或者,如果用户在忙于其他工作时继续处理其他事情,可能会导致一些问题。

答案 3 :(得分:1)

我的解决方案....

public class SetMouseCursor
{
    public static void Wait()
    {
        Application.UseWaitCursor = true;
        Cursor.Current = Cursors.WaitCursor;
    }

    public static void Default()
    {
        Application.UseWaitCursor = false;
        Cursor.Current = Cursors.Default;
    }
}

答案 4 :(得分:0)

手动设置光标。这就是我的工作。