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


当前回答

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

Cursor tempCursor = Cursor.Current;

Cursor.Current = Cursors.WaitCursor;

//do Time-consuming Operations         

Cursor.Current = tempCursor;

其他回答

你可以使用:

Mouse.OverrideCursor = Cursors.Wait; 

&&

Mouse.OverrideCursor = Cursors.Arrow;

你可以使用Cursor.Current。

// Set cursor as hourglass
Cursor.Current = Cursors.WaitCursor;

// Execute your time-intensive hashing code here...

// Set cursor as default arrow
Cursor.Current = Cursors.Default;

但是,如果散列操作非常长(MSDN将其定义为超过2-7秒),则可能应该使用游标以外的可视反馈指示器来通知用户进度。有关更深入的指导方针,请参阅本文。

编辑: 正如@Am指出的那样,您可能需要调用Application.DoEvents();在游标。Current = Cursors.WaitCursor;以确保沙漏是真实显示的。

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

Cursor tempCursor = Cursor.Current;

Cursor.Current = Cursors.WaitCursor;

//do Time-consuming Operations         

Cursor.Current = tempCursor;

在前面的基础上,我的首选方法(因为这是一个经常执行的操作)是将等待游标代码包装在一个IDisposable助手类中,这样它就可以与using()(一行代码)一起使用,接受可选参数,在其中运行代码,然后清理(恢复游标)。

public class CursorWait : IDisposable
{
    public CursorWait(bool appStarting = false, bool applicationCursor = false)
    {
        // Wait
        Cursor.Current = appStarting ? Cursors.AppStarting : Cursors.WaitCursor;
        if (applicationCursor) Application.UseWaitCursor = true;
    }

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

用法:

using (new CursorWait())
{
    // Perform some code that shows cursor
}

使用下面的类,您可以使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;
}