我使用扩展 WPF 工具包 BusyIndicator
我的 Xml
<extToolkit:BusyIndicator Name="wait" IsBusy="False" Cursor="Wait" Grid.ColumnSpan="3" Margin="10,10,10,10"/>
我的代码:
private void esp_Click(object sender, RoutedEventArgs e)
{
wait.IsBusy = true;
// My work here make some time to finish
wait.IsBusy = false;
}
但是它永远不会显示,我尝试在函数的末尾使 MessageBox 在 MessageBox 之后显示 BusyIndicator,
我试过了
wait.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send,
(Action)delegate
{
wait.IsBusy = true;
});
但是我什么都没有!!!
我解决不了的问题在哪里?
我发现了一个类似的问题,但我没有遇到同样的问题,但在功能完成后,指标显示出来了。
最佳答案
问题是您正在调度程序的线程中执行所有工作(我假设 esp_Click
是一个事件处理程序)。这实际上意味着在执行长任务时,不会更新 UI。
您需要在单独的线程中执行工作 - 创建新线程、使用线程池或创建任务。在开始之前将 IsBusy
设置为 true
,并在完成工作后设置为 false
。从另一个线程更新 Dispatcher.BeginInvoke/Invoke
时,您需要使用 wait.IsBusy
。
示例代码:
private void LongRunningTask()
{
// your long running code
// after you complete:
Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send,
(Action)delegate
{
wait.IsBusy = false;
});
}
private void esp_Click(object sender, RoutedEventArgs e)
{
wait.IsBusy = true; // either here, or in your long running task - but then remember to use dispatcher
var thread = new Thread(LongRunningTask);
thread.Start();
// OR
ThreadPool.QueueUserWorkItem(state => LongRunningState());
// OR, in .NET 4.0
Task.Factory.StartNew(LongRunningTask);
}
请注意,这两种解决方案都不处理异常 - 您必须自己添加错误处理(或在最后一个示例的情况下使用任务延续)。
关于c# - 如何强制 BusyIndicator?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6718893/