WPF ProgressBar теряет свечение, когда обновляется слишком быстро - ошибка? - PullRequest
2 голосов
/ 09 мая 2011

Хорошо, поэтому я обнаружил довольно странное поведение, возясь с элементом управления WPF ProgressBar.Этот элемент управления находится в столбце элемента управления ListView, и общая ситуация мало отличается от этого вопроса и ответа по своей сути.

Я связываю Progressbar с классом с помощью несколькихсвойства (Min, Max, Value), все привязки OneWay, очевидно.Этот другой класс обновляется из другого потока и регулярно использует интерфейс INotifyPropertyChanged, чтобы сообщить ProgressBar, что состояние прогрессирует.И все это прекрасно работает!

Но вот тут-то и странно.Мой ProgressBar теряет свечение ... вплоть до момента, когда он достигает значения Max (= 100%).Затем он внезапно начинает пульсировать своим белым светящимся материалом по всей зеленой полосе, и это очень раздражает.Я показываю прогресс по причине, и отсутствие импульса на самом деле довольно сильно отвлекает, как только вы начинаете замечать, что его там нет.

Таким образом, я отправляюсь на отладку.Я обнаружил, что при обработке Thread.Sleep(1000) в моих потоках он все еще скрывал свечение, но если я увеличу его до Thread.Sleep(1500), свечение всегда возвращается с безумной энергией.После этого я попытался перевести свои единицы прогресса в меньшие числа, чтобы изменить целочисленные значения.Мин 0, Макс 100 до сих пор не имеет свечения.Мин 0, Макс 10 заставил свечение вернуться в полную силу.Во всех случаях это тот же объем работы и время, потраченное на достижение 100%, но это очень заметный двоичный эффект ДА / НЕТ в отношении отображения свечения.Единственное, что я не проверял, так это то, происходит ли это, когда ProgressBar не находится внутри этого элемента управления ListView.

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

Моя машина работает под управлением Windows 7, и я занимаюсь разработкой вVS2010 для клиентского профиля .NET Framework 4.

1 Ответ

0 голосов
/ 23 октября 2011

Я бы сделал предположение и сказал бы, что вы теряете свечение, потому что вы часто обновляете свой индикатор выполнения. Каждый раз, когда вы устанавливаете новое значение, индикатор выполнения перезапускает свою светящуюся анимацию (я думаю - я не проверял это, я списываю голову).

Кажется, вы, возможно, думали об одном и том же и пытались обойти это, но я не уверен, что вы полностью исчерпали все возможности:

  1. Попробуйте создать проверку того, что if (progressbar.Value == newValue) не выполняет progressbar.Value = newValue;
  2. Прогрессбар должен использовать десятичные числа для Min, Max, Value. Убедитесь, что вы не делаете обновления для каждой десятичной точки, например. - 10,1; 10,2; 10,3; и т.д ... (используйте progressbar.Value = (int) newValue;)
  3. Попробуйте установить значение индикатора выполнения с большими приращениями, вместо приращения = 1, используйте приращение = 10;
  4. Вы можете попробовать использовать индикатор выполнения вне ListView, возможно, есть ошибка рендеринга с индикатором прогресса внутри него.

PS! Если вы очень быстро обновляете свой индикатор выполнения, тогда нормально, если анимация свечения не запускается. Помните, что цель анимирования свечения состоит только в том, чтобы показать, что приложение все еще работает (машина не зависла), несмотря на то, что прогресс (полоса) не перемещался.
Если прогресс движется быстро, то это само по себе является визуальным эффектом для пользователя, поэтому в этот момент не требуется анимация свечения ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...