在backgroundworker运行时显示等待光标

arc*_*880 16 c# cursor backgroundworker wait

在我的Windows应用程序启动期间,我必须调用Web服务来检索一些默认数据以加载到我的应用程序中.在加载表单期间,我运行后台工作程序来检索此数据.我想显示等待光标,直到检索到这些数据.我该怎么做?

我已经尝试在调用backgroundworker运行之前设置等待光标.当我报告100的进度时,我将其设置回默认光标.等待光标出现但是当我移动鼠标时它会消失.

环境:

  • Windows 7 Pro 64位
  • VS2010 C#.NET 4.0
  • Windows窗体

编辑:我按照Jay Riggs建议的方式设置光标.它只有在我不移动鼠标时才有效.

**更新:我创建了一个单击按钮,执行以下操作:当我按下按钮并单击并移动鼠标时,无论我是否移动鼠标,都会出现等待光标.

void BtnClick()
{
  Cursor = Cursors.WaitCursor;
  Thread.Sleep(8000);
  Cursor = Cursors.Default;
}
Run Code Online (Sandbox Code Playgroud)

如果我执行以下操作:我看到等待光标,当我移动鼠标时,它会消失在窗体内.如果我移动到状态栏或菜单栏,则会出现等待光标.

Cursor = Cursors.WaitCursor;
if (!backgroundWorker.IsBusy)
{
  backGroundWorker.RunWorkerAsync();
}

void backGroundWorkerDoWork(object sender, DoWorkEventArgs e)
{
  Thread.Sleep(8000);
}

void backGroundWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
  Cursor = Cursors.Default;
}
Run Code Online (Sandbox Code Playgroud)

如果我执行以下操作:等待光标出现,当我移动鼠标时它仍然出现,但有时在文本字段中移动时会闪烁关闭和打开.虽然光标变为等待光标,但它不会阻止您单击任何内容.

if (!backgroundWorker.IsBusy)
{
  backGroundWorker.RunWorkerAsync();
}

void backGroundWorkerDoWork(object sender, DoWorkEventArgs e)
{
  UseWaitCursor = true;
  Thread.Sleep(8000);
}

void backGroundWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
  UseWaitCursor = false;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*wul 18

有用UseWaitCursor吗?(调用RunWorkerAsync()时设置为true,调用完成事件时设置为false).你现在用什么来设置光标?


Mus*_*sis 11

不要为此显示等待光标 - 而是使用表单上的控件来指示后台工作人员正忙着做某事.等待光标是UI线程使用的适当指示器(因为它表示用户不能/不应该触摸任何东西),但它不适合在后台发生的事情.


Wil*_*ean 6

在WPF中,我通过在启动Backgroundworker之前将Mouse.OverrideCursor属性设置为Cursors.Wait然后将其重置nullRunWorkerCompleted事件来完成此操作.到目前为止似乎工作得很好.

public void go()
{
    BackgroundWorker thread = new BackgroundWorker();

    thread.DoWork += run;
    thread.RunWorkerCompleted += taskCompleted;
    thread.WorkerReportsProgress = true;

    // Change mouse cursor to busy
    Mouse.OverrideCursor = Cursors.Wait;

    thread.RunWorkerAsync();
}

private void taskCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // Reset mouse cursor
    Mouse.OverrideCursor = null;
}
Run Code Online (Sandbox Code Playgroud)