我使用扩展 WPF 工具包 BusyIndi​​cator

我的 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 之后显示 BusyIndi​​cator,

我试过了
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# - 如何强制 BusyIndi​​cator?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6718893/

10-12 06:44