индикатор выполнения в отдельном окне - PullRequest
1 голос
/ 08 февраля 2011

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

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

Это вообще возможно? Лучшая идея?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2011

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

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

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

Вызов

Надеюсь, это поможет !!

1 голос
/ 08 февраля 2011

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

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

...