我的"button_click“操作中有一些代码。我想在此代码工作期间禁用该按钮。
private void button1_Click(object sender, RoutedEventArgs e)
{
button1.IsEnabled = false;
// some code (its take about 2-5 sec)
button1.IsEnabled = true;
}但这不管用。这个按钮永不停用。
发布于 2014-02-05 19:10:44
您需要在后台线程上运行“一些代码”部分:
button1.Enabled = false;
Task.Factory.StartNew(() => {
// some code (its take about 2-5 sec)
}).ContinueWith(task => {
button1.Enabled = true;
}, TaskScheduler.FromCurrentSynchronizationContext());发布于 2014-02-05 19:10:30
这是因为您的UI在整个操作期间锁定。
您应该在某种背景线程中编写任务。
您可以为此使用BackgroundWorker,但最好是使用Task。
BackgroundWorker bgw = new BackgroundWorker();
bgw.DoWork += bgw_DoWork;
bgw.RunWorkerCompleted += bgw_RunWorkerCompleted;
button.Enabled = false;
bgw.RunWorkerAsync();
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
// your task
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// update the button
button.Enabled = true;
}发布于 2014-02-05 19:31:51
Dispatcher负责WPF中的消息抽取。每个线程都有与其相关联的调度程序,它负责根据项目的DispatcherPriority对该线程上的内容进行排队。
在您的示例中,GUI呈现是在DispatcherPriority.Render上完成的,但是现在dispatcher正在忙着执行您的按钮,单击事件处理程序代码,所以在代码执行完成之前,GUI呈现永远不会发生。这就是为什么只有在完全执行处理程序时才会看到按钮被刷新的原因。
在sidenote上,McGarnagle提议的内容将起作用,但您也可以通过显式地将调度程序上的空委托与优先级Render排队,这将迫使优先级更高或等于的所有排队项在进一步处理之前进行呈现。因此,您将在GUI上看到刷新:
button1.IsEnabled = false;
Application.Current.Dispatcher.Invoke((Action)(() => { }),
DispatcherPriority.Render);
// some code (its take about 2-5 sec)
button1.IsEnabled = true;https://stackoverflow.com/questions/21586288
复制相似问题