Я не совсем уверен, как вы намерены использовать индикатор прогресса для объединения различных достижений, но если, скажем, самый дальний прогресс находится внизу z-индекса, а наименьший вдоль прогресса - вверху, тогда я бы сделал что-то вроде этого:
1) Возможно, я бы создал пользовательский элемент управления для этого нового прогресбара.
2) У него будет свойство NumberOfProgresses, которое связано с массивом, содержащим состояние указанных прогрессов.
3) Каждый прогресс будет представлен элементом Border (или, возможно, чем-то более подходящим для визуального дерева), потому что это простой элемент управления wpf со свойством background. Для свойства background будет задан красивый стиль прогресса, а цвет прогресса можно связать в стиле, чтобы сказать свойство borderbrush границы. Позволяет легко установить цвет прогресса.
4) Пользовательский элемент управления будет иметь метод UpdateProgress, который принимает в качестве параметров процентное значение и индекс прогресса в массиве.
5) По мере обновления вы можете либо просто рассчитать соответствующую ширину (фактическая ширина пользовательского элемента управления * в процентах) для границы и поиграть с индексом Z, чтобы он отображался сверху / снизу, либо сложить границы по горизонтали, сначала установите наименьшее по ходу выполнения, а затем для остальных прогрессов вам придется вычесть предыдущие длины прогрессов, чтобы получить тот же эффект.
Таким образом, не было бы артефактов, вызванных прозрачностью, и OnRender () ...
Имейте в виду, в WPF не должно быть причин связываться с OnRender этим и OnRender, как это требовалось в WinForms с OnPaint.
Просто установите элементы с помощью кода, чтобы получить желаемый вид, и позвольте WPF выполнять его рендеринг;)
Хотя я могу представить одну проблему с этим пользовательским элементом управления. Вы должны предоставить отзыв пользователю о том, какой цвет принадлежит к какому прогрессу. Но это, вероятно, вернет вас к исходной точке, а это означает, что лучше / проще отображать несколько индикаторов прогресса.