WPF - синхронное обновление пользовательского интерфейса - PullRequest
2 голосов
/ 27 июля 2011

Если я правильно понимаю, изменение любого элемента управления в WPF (например, текста метки) ставит в очередь обновление в Dispatcher. Диспетчер ожидает завершения моего кода и, когда у него есть время, обрабатывает всю очередь.

Для этого звоните

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");

, где ReportProgress вызывает событие с этим обработчиком события

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

заканчивается полным индикатором выполнения и выводится сообщение «Готово», но промежуточные шаги не отображаются.

Мне известно, что это можно сделать, вызвав функцию в другом потоке и асинхронно обновив интерфейс (и это произойдет в какой-то момент), но на данный момент добавление потоков кажется ненужным осложнением.

Как заставить Диспетчер немедленно обновлять и перерисовывать?

1 Ответ

0 голосов
/ 27 июля 2011

Если вы не хотите использовать фоновый поток, то до и после установки значения индикатора выполнения может помочь старый взлом Application.DoEvents(), так как он будет ожидать очистки всей очереди сообщений, скопившейся в шине сообщений GUI

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...