WPF Custom Draw Несколько Прогресс-бар - PullRequest
3 голосов
/ 30 апреля 2009

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

sample image

Я сталкиваюсь с некоторыми артефактами прозрачности (фиолетовая полоска на самом деле фиолетовая под зеленым, иногда она перерисовывается поверх и т. Д.), И это кажется немного расточительным. Итак, я решил сделать свой собственный, но теперь у меня есть паралич того, как это сделать. Я использую DrawingContext в OnRender FrameworkElement, или есть что-то более простое? Существует ли набор общих правил, когда речь идет о создании собственного контроля?

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

Спасибо!

1 Ответ

1 голос
/ 21 июля 2010

Я не совсем уверен, как вы намерены использовать индикатор прогресса для объединения различных достижений, но если, скажем, самый дальний прогресс находится внизу z-индекса, а наименьший вдоль прогресса - вверху, тогда я бы сделал что-то вроде этого:

1) Возможно, я бы создал пользовательский элемент управления для этого нового прогресбара.

2) У него будет свойство NumberOfProgresses, которое связано с массивом, содержащим состояние указанных прогрессов.

3) Каждый прогресс будет представлен элементом Border (или, возможно, чем-то более подходящим для визуального дерева), потому что это простой элемент управления wpf со свойством background. Для свойства background будет задан красивый стиль прогресса, а цвет прогресса можно связать в стиле, чтобы сказать свойство borderbrush границы. Позволяет легко установить цвет прогресса.

4) Пользовательский элемент управления будет иметь метод UpdateProgress, который принимает в качестве параметров процентное значение и индекс прогресса в массиве.

5) По мере обновления вы можете либо просто рассчитать соответствующую ширину (фактическая ширина пользовательского элемента управления * в процентах) для границы и поиграть с индексом Z, чтобы он отображался сверху / снизу, либо сложить границы по горизонтали, сначала установите наименьшее по ходу выполнения, а затем для остальных прогрессов вам придется вычесть предыдущие длины прогрессов, чтобы получить тот же эффект.

Таким образом, не было бы артефактов, вызванных прозрачностью, и OnRender () ... Имейте в виду, в WPF не должно быть причин связываться с OnRender этим и OnRender, как это требовалось в WinForms с OnPaint. Просто установите элементы с помощью кода, чтобы получить желаемый вид, и позвольте WPF выполнять его рендеринг;)

Хотя я могу представить одну проблему с этим пользовательским элементом управления. Вы должны предоставить отзыв пользователю о том, какой цвет принадлежит к какому прогрессу. Но это, вероятно, вернет вас к исходной точке, а это означает, что лучше / проще отображать несколько индикаторов прогресса.

...