WPF自定义绘制多个进度条

3
在处理一组项目时,我希望显示该组的统一状态图像,因此我基本上创建了一个网格,其中包含多个进度条,具有透明背景和各种颜色的前景,全部位于同一个单元格中。

sample image

我遇到了一些透明度伪像问题(紫色条实际上是在绿色下面的紫色,有时会画在顶部等),而且这似乎有点浪费资源。所以,我决定自己制作,但现在我有点不知道该如何操作。我应该使用FrameworkElement的OnRender中的DrawingContext,还是有更简单的方法?在制作您自己的控件方面是否存在一组通用规则?
我考虑过切换到饼图,因为那些很容易得到,但是现在该是我做些非现成的东西的时候了。
谢谢!
1个回答

1

我不太确定您打算如何将进度条组合起来,但是如果说最远的进度在z-index的底部,最少的进度在顶部,那么我会按照以下方式进行:

1)我可能会为这个新的进度条创建一个用户控件。

2)它将具有一个名为NumberOfProgresses的属性,该属性与包含所述进度状态的数组相关联。

3)每个进度都由一个Border项(或者可能是更适合于视觉树的其他内容)表示,因为它是一个简单的wpf控件,具有背景属性。背景属性将设置为漂亮的进度样式,并且进度颜色可以绑定到边框的borderbrush属性中。这样可以轻松设置进度的颜色。

4)用户控件将具有一个UpdateProgress方法,该方法以百分比值和数组中进度的索引作为参数。

5) 随着进度的更新,您可以计算边框的适当宽度(用户控件实际宽度*百分比),并玩弄Z索引以使其显示在顶部/底部,或者水平堆叠边框,将最小进度设置为第一项,然后对于其他进度,您必须减去先前进度的长度以获得相同的效果。

这样就不会有透明度引起的伪影和没有OnRender()... 请注意,在WPF中,没有理由像在WinForms中需要OnPaint那样搞OnRender这个和OnRender那个。 只需通过代码设置元素以获得所需的外观,让WPF进行渲染即可;)

我可以想象这个用户控件可能会遇到一个问题。您必须向用户提供反馈,以了解哪种颜色属于哪种进度。但是,这可能会使您回到原点,这意味着最好/更简单的方法是显示多个进度条。


那么,这可能只是一个 .cs 文件吗? - Thomas
取决于您创建用户控件的方式。如果您不打算在其他应用程序中重复使用它,则可能会向解决方案添加一个新的wpf UserControl,其中包括xaml和cs。在xaml部分,您将定义基本布局,主要是代表进度的边框项的容器。在cs文件中,您将编写实际创建新边框并将其放入容器中的代码,还有更新进度方法... - Marko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接