Обновление индикатора выполнения во время привязки данных wpf (в c #) - PullRequest
2 голосов
/ 07 мая 2010

РЕДАКТИРОВАТЬ - После игры с кучей потенциальных решений (с использованием backgroundworker и отдельных потоков) я обнаружил, что ключевая проблема здесь заключается в том, чтобы привязка данных была прервана. Поскольку индикатор выполнения представляет собой анимированный кружок (а не процент выполнения), он должен реагировать на событие таймера через равные промежутки времени, чтобы плавно анимировать (поэтому я не могу связать данные одну за другой, а затем отправить обновление «прогресс» обратно в нить пользовательского интерфейса). Кто-нибудь знает, как можно разрешить анимацию во время привязки данных? Еще раз спасибо за каждый вклад!

Оригинал Q -

Я связываю большой набор данных со списком WPF, что может занять много времени (более десяти секунд). Пока данные связаны, я бы хотел отобразить круговой индикатор

Я не могу отобразить индикатор выполнения во время привязки данных, хотя я пытаюсь выполнить привязку в фоновом режиме. Я проверил это, сделав первую строку события dowork backgroundworkd Thread.Sleep (5000) и убедившись, что индикатор выполнения начал вращаться в течение этой продолжительности только для того, чтобы замерзнуть, когда началось связывание.

Это связано с тем, что привязка данных и обновление пользовательского интерфейса должны выполняться в одном потоке? Любые идеи о том, как обойти это?

Спасибо за вашу помощь !!

Ответы [ 5 ]

3 голосов
/ 07 мая 2010

Хорошее введение в работу с WPF Диспетчер и индикатор выполнения можно найти в статье CodeProject: WPF ProgressBar

Статья довольно короткая, но предоставляет отличную отправную точку для обновления пользовательского интерфейса WPF, в то время как работа должна выполняться в фоновом режиме.

Помните : по умолчанию вся работа выполняется в потоке пользовательского интерфейса в WPF.

1 голос
/ 07 мая 2010

Используйте слой adorner и поместите в него свой индикатор прогресса - это позволит ему наложить элементы управления на экран и по-прежнему реагировать.Загружайте свои данные в обратном потоке и периодически обновляйте элемент управления, в котором отображаются результаты (я бы также рекомендовал использовать панель виртуализированных стеков в качестве панели элементов).Таким образом, вы можете держать индикатор прогресса на переднем плане на таймере для анимации и выдвигать входящие данные в представление результатов с помощью диспетчера и шлюза.Мы внедрили аналогичное решение для клиента (большое количество данных, поступающих через веб-сервисы java и помещенных в сетку с постепенным изменением цвета;)), и оно работало как победитель.

0 голосов
/ 08 ноября 2013

Анимация будет происходить только тогда, когда поток пользовательского интерфейса простаивает. Вот почему использование потока или TaskFactory.StartNew (...) поможет. Если вы привяжете значение индикатора выполнения к свойству и обновите его из задачи или фонового потока, вы получите приятную и плавную анимацию. :)

0 голосов
/ 07 мая 2010

Скорее всего, это будет не привязка , а создание элементов управления для привязки - рендеринг элемента управления.

Вы пытались использовать VirtualisingStackPanel в качестве ItemsPanel?Если это узкое место в рендеринге, это может улучшить ситуацию.

0 голосов
/ 07 мая 2010

Привязка будет происходить в потоке пользовательского интерфейса, поэтому вы должны обновить индикатор выполнения через BackgroundWorker и использовать Dispatcher.Invoke, чтобы получить его в потоке пользовательского интерфейса.

...