2

我有一个标准的 WPF MainWindow 类,我想使用 显示一个消息框System.Windows.MessageBox,从用户那里获得响应,然后运行一个长时间运行的操作(下面通过调用来模拟Sleep(...))。我想将光标设置Cursors.Wait在操作之前,并在最后恢复正常。这是我所拥有的:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void ui_button_Click(object sender, RoutedEventArgs e)
    {
        if (MessageBox.Show("Do you want to change the background?", "Change background", MessageBoxButton.YesNo) == MessageBoxResult.No)
        {
            return;
        }

        Cursor = Cursors.Wait;

        Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
            {
                System.Threading.Thread.Sleep(1500);

                if (Background != Brushes.Green)
                {
                    Background = Brushes.Green;
                }
                else
                {
                    Background = Brushes.White;
                }
                Cursor = Cursors.Arrow;
            }));
    }
}

这不起作用:光标永远不会作为等待光标出现。但是,如果我注释掉这些MessageBox行,它确实有效。这里发生了什么,我怎样才能让它按预期工作?

4

4 回答 4

6

以下代码对我有用:而不是

Cursor = Cursors.Wait;

试试这个:

Mouse.OverrideCursor = Cursors.Wait;
Mouse.UpdateCursor();

您以相反的方式关闭等待光标:

Mouse.OverrideCursor = null;
Mouse.UpdateCursor();
于 2012-12-18T13:07:49.560 回答
1

您在与光标更改相同的 UI 线程中运行背景更改。当然它正忙于睡眠,所以它不显示光标变化。只需按应有的方式举例(有几个线程),一切都会好起来的!

 private void ui_button_Click(object sender, RoutedEventArgs e)
  {
     if (MessageBox.Show("Do you want to change the background?", "Change background", MessageBoxButton.YesNo) == MessageBoxResult.No)
     {
        return;
     }

     Cursor = Cursors.Wait;

     BackgroundWorker bw = new BackgroundWorker();
     bw.DoWork += BwOnDoWork;
     bw.RunWorkerCompleted += BwOnRunWorkerCompleted;
     bw.RunWorkerAsync();
  }

  private void BwOnRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs runWorkerCompletedEventArgs)
  {
     if (Background != Brushes.Green)
     {
        Background = Brushes.Green;
     }
     else
     {
        Background = Brushes.White;
     }
     Cursor = Cursors.Arrow;
  }

  private void BwOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
  {
     System.Threading.Thread.Sleep(1500);
  }
于 2012-12-18T13:05:14.540 回答
0

尝试

DialogResult dialogResult = MessageBox.Show("Do you want to change the background?", "Change background", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.No)
{
    return;
}

代替

if (MessageBox.Show("Do you want to change the background?", "Change background", MessageBoxButton.YesNo) == MessageBoxResult.No)
于 2012-12-18T12:50:56.153 回答
0

尝试将要运行的代码放在其他线程中

     ThreadPool.QueueUserWorkItem(delegate
     {
       //your code here...
     });
于 2012-12-18T13:09:00.373 回答