Пользовательское рисование нескольких индикаторов выполнения WPF

StackOverflow https://stackoverflow.com/questions/804347

Вопрос

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

sample image

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

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

Спасибо!

Это было полезно?

Решение

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top