В моем приложении я разрешаю пользователю выбирать элемент из дерева элементов в левой части, и когда этот элемент выбирается, я должен обновить интерфейс пользователя с правой стороны. Теперь, во время обновления пользовательского интерфейса (который может занять секунду или два), я показываю сообщение "Подождите", чтобы указать, что приложение в настоящее время работает через фоновый поток.
Когда загрузка пользовательского интерфейса завершена, я хочу, чтобы окно "Подождите" исчезнет, но теперь проблема заключается в том, что процесс извлечения данных заканчивается довольно быстро, что приводит к исчезновению окна "Подождите", но поскольку пользовательский интерфейс hasn 't еще не обновлено, приложение застряло на секунду, а затем, только после того, как пользовательский интерфейс был обновлен, он будет выпущен.
Как отправить сообщение, чтобы удалить окно сообщения "Подождите", только после того, как пользовательский интерфейс завершит свою работу и обновится? (Я использую класс GalaSoft Messenger
для отправки сообщений через мое приложение)
EDIT: Это мой код для справки:
// 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:
Я знаю асинхронное программирование. Мой вопрос был в основном, потому что моя "тяжелая работа" была выполнена, и сообщение "please wait" было удалено, но пользовательский интерфейс освежает, чтобы отразить результаты тяжелой работы, и это занимает несколько секунд. Я хочу сохранить сообщение "Please Wait" на экране, пока все пользовательские интерфейсы не загрузится (возможно, с помощью события Loaded
на элементе управления?)
Году слишком поздно, но вместо того, чтобы заставить рендер, почему бы не попытаться дождаться рендеринга, чтобы закончить и отправить?
Может быть, избавиться от этой линии и сделать
Application.Current.Dispatcher.Invoke(new Action(() => LoadingHelper.HideProgressBar()), DispatcherPriority.ContextIdle, null)
на точной линии вы пытаетесь сделать рендер?
Что вы ищете, это асинхронное программирование
Прочтите это http://msdn.microsoft.com/en-us/library/hh191443.aspx
Это помогает в такой ситуации, когда вы не хотите блокировать пользовательский интерфейс (и, следовательно, плохое отражение пользовательского интерфейса для пользователя), но нужно выполнять работу в фоновом режиме.
В этой статье есть некоторые примеры использования.
Создайте свою задачу, чтобы выполнить тяжелую работу.
Создайте метод async void, чтобы вызвать задачу и ждать ее.
Перед тем как дождаться задания, покажите свое занятое сообщение> ожидание задачи>, когда задача завершена, удалите сообщение "занято".
Важно то, что вы убираете нагрузку на поток пользовательского интерфейса и передаете его другому. На данный момент звучит так, как будто ваш поток пользовательского интерфейса делает больше обработки, чем нужно.