我有一个标准的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
行,它确实有效。这里发生了什么,我怎样才能让它按预期工作?
答案 0 :(得分:4)
以下代码适用于我:而不是
Cursor = Cursors.Wait;
试试这个:
Mouse.OverrideCursor = Cursors.Wait;
Mouse.UpdateCursor();
您以相反的方式关闭等待光标:
Mouse.OverrideCursor = null;
Mouse.UpdateCursor();
答案 1 :(得分: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);
}
答案 2 :(得分: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)
答案 3 :(得分:0)
尝试将您想要在其他线程中运行的代码
ThreadPool.QueueUserWorkItem(delegate
{
//your code here...
});