我在Windows Phone 8项目中实现了自定义进度条指示器。如果我尝试用按钮切换指示器,它工作正常。但是我当然希望它在执行耗时的操作时出现(填充包含许多项目的列表)。但是当它阻止UI时,进度条指示器在动作之前不会显示但仅在之后显示。在对列表进行修改之前,我在指标本身和整个页面上尝试了.UpdateLayout()
,但没有一个有效。
customIndeterminateProgressBar.Visibility = System.Windows.Visibility.Visible;
// add ~100 list items
customIndeterminateProgressBar.Visibility = System.Windows.Visibility.Collapsed;
还有其他办法吗?
答案 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)
你应该异步运行繁重的工作(更多关于MSDN和Stephen 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;
}