Custom ProgressBar Indicator not showing up before time consuming action

自古美人都是妖i 提交于 2019-12-25 03:07:06

问题


I implemented the custom progressbar indicator in my Windows Phone 8 project. It works fine if I try to toggle the indicator with a button. But of course I want it to show up while I perform time consuming actions (filling a list with many items). But as it blocks the UI the progressbar indicator doesn't show up before the action but only afterwards. I tried .UpdateLayout() on the indicator itself and the whole page before performing modifications to the list but none of it worked.

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

// add ~100 list items

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

Is there any other way to do this?


回答1:


You could offload your time consuming work to a new task and add a continuation to set progress bar visibility at the end. Here i'm using the Task Parallel Library to achieve this:

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

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



回答2:


You should run your heavy job asynchronously (more about async at MSDN and at the Stephen Cleary Blog) - so that it won't block UI.

The very simple example where you have a ProgressBar and a heavy Task which will inform PBar about its progress can look like this: (I've subscribed the start of the method to 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;
}


来源:https://stackoverflow.com/questions/23182740/custom-progressbar-indicator-not-showing-up-before-time-consuming-action

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!