WPF Animated ProgressBar в приложении WinForms

У меня есть приложение WinForms, и я хотел добавить несколько приятных элементов управления WPF, одним из которых является «неопределенный» индикатор выполнения ..., который просто красиво анимируется, пока я не скажу ему остановиться.

Я сделал это и ломал голову, почему это не анимировалось (изменение значения индикатора выполнения).

В конце концов я попытался показать свою форму (содержащую ElementHost) модально, и вуаля, она анимируется, но я хочу показать форму немодально, так как я хочу продолжить обработку за кулисами.

Есть ли какой-то параметр, который сообщает окну ElementHost продолжать «анимацию»?

Спасибо Рич.


person Rich S    schedule 12.12.2011    source источник
comment
Я делал что-то подобное в прошлом (WPF Progressbar через ElementHost в приложении WinForms), и у меня не было проблемы, которую вы описываете. Вы пытались изолировать и воспроизвести это поведение в новом проекте?   -  person SvenG    schedule 12.12.2011
comment
нет, но я могу.. это довольно просто.   -  person Rich S    schedule 12.12.2011
comment
хорошо, я сделал это в отдельном проекте, и сначала это сработало, но потом, как только я попытался выполнить некоторую обработку и thread.sleep, он перестал анимироваться. Может быть, мне нужно делать обновления моей базы данных в отдельном потоке... который освободит этот поток для продолжения анимации? или есть способ сказать WPF, чтобы он делал это в другом потоке?   -  person Rich S    schedule 12.12.2011
comment
Итак, ваша операция с базой данных блокирует поток пользовательского интерфейса WPF. Попробуйте DispatcherTimer вместо обычного таймера. Если это не поможет, взгляните на Диспетчер WPF, чтобы обновить индикатор выполнения. Кстати: избегайте Thread.Sleep, это не очень хороший способ программирования потоков, и его следует избегать в большинстве случаев.   -  person SvenG    schedule 12.12.2011
comment
Не волнуйтесь, я обычно не использую его, я просто хотел посмотреть, будет ли он по-прежнему анимироваться, пока «текущий» поток занят. А также.. Я не использую «Таймер», я использую «Двойную анимацию».   -  person Rich S    schedule 12.12.2011
comment
Вы можете запускать обновления базы данных с помощью backgroundworked. Это способ запустить его в фоновом потоке, но он позаботится о многих деталях за вас.   -  person paparazzo    schedule 13.12.2011
comment
Это круто — как только я заметил, что анимация выполняется в потоке графического интерфейса, я реализовал асинхронную модель в рабочем «процессе». Спасибо за ваши предложения.   -  person Rich S    schedule 13.12.2011
comment
PS. что мне теперь делать с этим вопросом? я сам на него отвечу? (Я относительно новичок в этом!)   -  person Rich S    schedule 13.12.2011


Ответы (2)


Есть много способов сделать это, самый простой — использовать backgroundworker для длительной задачи. У Backgroundworker есть событие, чтобы сообщить о прогрессе. Обработайте это событие и в обработчике измените значение индикатора выполнения. Просто иметь анимацию в основном потоке, продолжая выполнять работу в основном потоке, не будет работать правильно...
Еще один подход, который вы можете попробовать (хотя я бы не рекомендовал его для здорового приложения), заключается в реализации DoEvents. функцию и вызовите ее в основном потоке, когда вы хотите обновить индикатор выполнения... Вот ссылка на реализацию DoEvents:
Предложение MSDN DoEvents
Я настоятельно рекомендую первый подход, хотя

person Rayden    schedule 13.12.2011
comment
Привет, я не уверен, читали ли вы мои последние два комментария к моему первоначальному вопросу? Я решил это, реализовав вызов асинхронного метода. Я знаю о различных способах передачи этой информации обратно на индикатор выполнения, моя проблема заключалась в том, что я не осознавал, что анимация выполняется в потоке основного графического интерфейса. Как только я это узнал, я смог реализовать свое решение. - person Rich S; 13.12.2011

Как я упоминал в своем комментарии выше, решение состоит в том, чтобы запустить обработку в отдельном потоке, что позволяет основному потоку графического интерфейса .net выполнять свои функции и анимировать индикатор выполнения.

person Rich S    schedule 25.01.2012