WPF自定义绘制多个进度条

标签 wpf custom-controls progress-bar

在处理一组项目时,我想显示一个组状态的统一图像,所以我基本上在同一个单元格中制作了一个由多个具有透明背景和各种彩色前景的进度条组成的网格。

sample image

我遇到了一些透明度伪影(紫色条实际上是绿色下面的紫色,有时它会在顶部绘制等),这似乎有点浪费。所以,我决定自己做,但现在我对如何做有点不知所措。我是在 FrameworkElement 的 OnRender 中使用 DrawingContext,还是有更简单的方法?在进行自己的控制时,是否有一套通用规则?

我考虑改用饼图,因为这些很容易获得,但现在是我做一些非现成的事情的时候了。

谢谢!

最佳答案

我不太确定您打算如何让进度条组合不同的进度,但是如果说最远的进度在 z-index 的底部,而最少的进度在顶部,那么我会在这行:

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

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

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

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

5)随着进度的更新,您可以只计算边框的适当宽度(用户控制实际宽度 * 百分比)并使用 Z 索引使其显示在顶部/底部,或者水平堆叠边框,设置首先是最少的进度,然后对于其余的进度,您必须减去以前的进度长度才能获得相同的效果。

这样就不会有透明度引起的伪影,也没有 OnRender()...
请注意,在 WPF 中,没有理由混淆 OnRender this 和 OnRender that,就像 WinForms 和 OnPaint 一样。
只需通过代码设置元素以获得您想要的外观,然后让 WPF 进行渲染;)

不过,我可以想象这个用户控件存在一个问题。您必须向用户提供关于哪种颜色属于哪个进度的反馈。但这可能会让你回到第一方,这意味着只显示多个进度条会更好/更简单。

关于WPF自定义绘制多个进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/804347/

相关文章:

c# - 鼠标悬停在代码后面时堆栈面板突出显示

c# - wpf为按钮默认样式添加样式属性

c# - MVVM 异常处理

c# - 如何将 CssStyleCollection 用于 UserControl?

java - 尝试添加进度时进度条变为空

asp.net - 如何通过ASP.NET MVC上传文件并显示进度栏?

c# - Windows 窗体进度条 : Easiest way to start/stop marquee?

c# - 托管 C++ dll 中的 XmlnsDefinition

c# - 必须在与 DependencyObject 相同的线程上创建 DependencySource

wpf - wpf中带有图像和文本的按钮模板