2011-02-07 2 views
1

(WPF) Нам было предложено создать небольшое окно, которое появляется, когда приложение занято (вместо или в дополнение к курсору ожидания). Мы помещаем текстовый блок в окно, а ProgressBar с IsIndeterminate = true.индикатор выполнения в отдельном окне

Мы вызываем шоу в маленькое окошко, а затем запускаем наш долговременный процесс, вызывая Close на маленьком окне, когда мы закончим. Однако во время продолжительного процесса ProgressBar не показывает никакой активности, а маленькое окно показывает (не отвечает) в его названии.

Возможно ли это? Лучшая идея?

ответ

2

Вы должны посмотреть в использовании другой поток (или несколько потоков), чтобы делать тяжелую обработку, которая может занять больше времени, чем 100 мс (100 мс и выше может вызвать это «висит» Внешность, прежде чем «не отвечает» появляется.)

Вы можете создать новый поток с помощью объекта BackgroundWorker и подписаться на событие OnProgressChanged, чтобы указать обновление строки выполнения. Однако это не затрагивает проблему доступа к главному (UI) потоку хода. Вам нужно будет проверить, требуется ли Invoke, а затем вызвать часть кода, ответственную за обновление панели выполнения.

Вот StackOverflow вопрос, который показывает хороший метод расширения в принятом ответе на вызов метод вызова элемента управления:

Invoking

Надеется, что помогает !!

1

Проблема, скорее всего, что все, что вызывает «занятие» приложения, запускается в основном потоке приложения. Таким образом, приложение перестает отвечать на запросы, в том числе отвечает на запросы макета и рисования от ОС. Итак, когда приложение «занято», оно слишком занято, чтобы рисовать новое окно.

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