开发者

WPF - synchronous UI update

开发者 https://www.devze.com 2023-03-23 18:40 出处:网络
If I understand correctly changing any control in WPF (eg. text of a Label) enqueues an update in Dispatcher. Dispatcher waits for my code to finish and when it has time it processes the whole queue.

If I understand correctly changing any control in WPF (eg. text of a Label) enqueues an update in Dispatcher. Dispatcher waits for my code to finish and when it has time it processes the whole queue.

For this, calling

double  current = 0;
ReportProgress (0d, "ProcessingStarted");
foreach (var item in collection)
{
        item.Process(); //takes about 10s
        current++;
        ReportProgress (current / (double)collection.Count, "Processing item No. " + current.ToString () + " finished");
}
ReportProgress (1d, "Finished");

where ReportProgress invokes an event with this event handler

private void handlerProgressMade (object sender, ProgressEventArgs e)
{
    pbProgress.Value = pbProgress.Maximum * e.Percent;
    lbProgressMessage.Content = e.Message;
}

ends up with full progressbar and message "Finished" displayed, but the intersteps are not shown.

I am aware that it could be done by calling the function in different thread and updating UI asynchronously (and it is going to happen at some point), but for now adding threads seems like unnecessary complication.

How to开发者_运维百科 force the Dispatcher to update and redraw immediately?


if you dont want to use background thread, then before and after you set the progress bar value, old hack of Application.DoEvents() might help as it will wait to clear all message queue that got piled up in the GUI Message Bus

0

精彩评论

暂无评论...
验证码 换一张
取 消