我如何向用户显示等待/忙碌游标(通常是沙漏),让他们知道程序正在做什么?


当前回答

好的,其他人的观点很清楚,但我想补充一些,如下:

Cursor tempCursor = Cursor.Current;

Cursor.Current = Cursors.WaitCursor;

//do Time-consuming Operations         

Cursor.Current = tempCursor;

其他回答

我的方法是在后台工作程序中进行所有的计算。

然后像这样改变光标:

this.Cursor = Cursors.Wait;

并且在线程的finish事件中恢复游标:

this.Cursor = Cursors.Default;

注意,这也可以用于特定的控件,所以只有当鼠标在沙漏上方时,光标才会是沙漏。

实际上,

Cursor.Current = Cursors.WaitCursor;

临时设置等待游标,但不确保等待游标直到操作结束才显示。程序中的其他程序或控件可以很容易地将光标重置回默认箭头,就像在操作仍在运行时移动鼠标一样。

一个更好的显示等待游标的方法是在表单中设置UseWaitCursor属性为true:

form.UseWaitCursor = true;

这将显示窗体上所有控件的等待游标,直到将此属性设置为false。 如果你想等待光标显示在应用程序级别,你应该使用:

Application.UseWaitCursor = true;

使用下面的类,您可以使Donut的建议“异常安全”。

using (new CursorHandler())
{
    // Execute your time-intensive hashing code here...
}

类CursorHandler

public class CursorHandler
    : IDisposable
{
    public CursorHandler(Cursor cursor = null)
    {
        _saved = Cursor.Current;
        Cursor.Current = cursor ?? Cursors.WaitCursor;
    }

    public void Dispose()
    {
        if (_saved != null)
        {
            Cursor.Current = _saved;
            _saved = null;
        }
    }

    private Cursor _saved;
}

你可以使用:

Mouse.OverrideCursor = Cursors.Wait; 

&&

Mouse.OverrideCursor = Cursors.Arrow;

在WPF中使用:

Cursor = Cursors.Wait;

// Your Heavy work here

Cursor = Cursors.Arrow;