Отображение сообщения загрузки WPF до завершения обновления пользовательского интерфейса
В моем приложении я позволяю пользователю выбирать элемент из дерева элементов с левой стороны, и когда этот элемент будет выбран, я должен обновить пользовательский интерфейс с правой стороны. Теперь, во время обновления пользовательского интерфейса (который может занять секунду или две), я отображаю сообщение "Пожалуйста, подождите", чтобы указать, что приложение в настоящее время работает через фоновый поток.
Когда загрузка пользовательского интерфейса завершена, я хочу, чтобы это окно "Пожалуйста, подождите" исчезло, но теперь проблема заключается в том, что процесс извлечения данных заканчивается довольно быстро, из-за чего окно "Пожалуйста, подождите" исчезает, но поскольку пользовательский интерфейс Еще не обновлено, приложение застревает на секунду, а затем, только после обновления пользовательского интерфейса, оно выходит.
Как я могу отправить сообщение об удалении окна сообщения "Пожалуйста, подождите" только после того, как пользовательский интерфейс завершил свою работу и обновился? (Я использую GalaSoft's Messenger
класс для отправки сообщений через мое приложение)
РЕДАКТИРОВАТЬ: это мой код для справки:
// Show the "Please wait window" while running the long operation
var t = Task.Factory.StartNew(() => LoadingHelper.ShowProgressBar());
t.ContinueWith((priorTask) =>
{
// DOING SOME HEAVY LIFTING WORK HERE
// TRYING TO FORCE THE UI TO REFRESH
Application.Current.Dispatcher.Invoke(DispatcherPriority.Render, new Action(() => { }));
});
t.ContinueWith((antecedent) => LoadingHelper.HideProgressBar()); // Make the loading window disappear
EDIT2:
Я в курсе асинхронного программирования. Мой вопрос был, главным образом, так как моя "тяжелая работа" выполнена, и сообщение "Пожалуйста, подождите" удалено, но пользовательский интерфейс обновляется, чтобы отразить результаты тяжелой работы, и это занимает несколько минут. Я хочу оставить сообщение "Пожалуйста, подождите" на экране, пока весь пользовательский интерфейс не загрузится (возможно, с помощью Loaded
событие на контроле?)
2 ответа
Год слишком поздно, но вместо того, чтобы форсировать рендеринг, почему бы не попытаться дождаться окончания рендеринга и отправки?
Может быть, избавиться от линии, и сделать
Application.Current.Dispatcher.Invoke(new Action(() => LoadingHelper.HideProgressBar()), DispatcherPriority.ContextIdle, null)
на точной линии вы пытаетесь силой сделать?
То, что вы ищете, это асинхронное программирование
Прочитайте это http://msdn.microsoft.com/en-us/library/hh191443.aspx
Это помогает в конкретной ситуации, когда вы не хотите блокировать пользовательский интерфейс (и, следовательно, плохо отражаете пользовательский интерфейс), но вам нужно работать в фоновом режиме.
В этой статье есть несколько полезных примеров.
Создайте свою задачу, чтобы сделать тяжелую работу.
Создайте асинхронный метод void, чтобы вызвать задачу и дождаться ее.
Перед тем, как дождаться выполнения задачи, покажите свое сообщение о занятости> дождитесь выполнения задачи> после завершения задачи удалите сообщение о занятости.
Здесь важно то, что вы снимаете нагрузку с потока пользовательского интерфейса и передаете ее другому. На данный момент звучит так, будто ваш поток пользовательского интерфейса выполняет больше обработки, чем нужно.