自定义ProgressBar指示器在耗时的操作之前未显示

时间:2014-04-20 13:00:26

标签: c# windows-phone-8

我在Windows Phone 8项目中实现了自定义进度条指示器。如果我尝试用按钮切换指示器,它工作正常。但是我当然希望它在执行耗时的操作时出现(填充包含许多项目的列表)。但是当它阻止UI时,进度条指示器在动作之前不会显示但仅在之后显示。在对列表进行修改之前,我在指标本身和整个页面上尝试了.UpdateLayout(),但没有一个有效。

customIndeterminateProgressBar.Visibility = System.Windows.Visibility.Visible;

// add ~100 list items

customIndeterminateProgressBar.Visibility = System.Windows.Visibility.Collapsed;

还有其他办法吗?

2 个答案:

答案 0 :(得分:2)

您可以将耗时的工作卸载到新任务,并添加续集以在最后设置进度条可见性。在这里,我使用Task Parallel Library来实现这一目标:

customIndeterminateProgressBar.Visibility = System.Windows.Visibility.Visible;

Task.Run(() =>
{
   // Do CPU intensive work
}).ContinueWith(task =>
{
   customIndeterminateProgressBar.Visibility = System.Windows.Visibility.Collapsed;
}, TaskScheduler.FromCurrentSynchronizationContext());

答案 1 :(得分:2)

你应该异步运行繁重的工作(更多关于MSDNStephen Cleary Blog的异步) - 这样它就不会阻止用户界面。

一个非常简单的例子,你有一个ProgressBar和一个重Task,它会告诉PBar它的进展可能如下所示:(我已经将方法的开头订阅了Button Click)

private async void StartBtn_Click(object sender, RoutedEventArgs e)
{
    var progress = new Progress<double>( (p) =>
        {
            progresPB.Value = p;
        });
    await DoSomething(progress); // start asynchronously Task with progress indication
}

private Task<bool> DoSomething(IProgress<double> progress)
{
    TaskCompletionSource<bool> taskComplete = new TaskCompletionSource<bool>();
    // run your heavy task asynchronous
    Task.Run(async () =>
        {
            for (int i = 0; i < 10; i++) // work divided into parts
            {
                await Task.Delay(1000);    // some heavy work 
                progress.Report((double)i / 10);
            }
            taskComplete.TrySetResult(true);
        });
    return taskComplete.Task;
}