1

我需要在 WPF 中为工作中的项目编写一个仪表控件。通过仪表控制,我的意思类似于传统的汽车速度计:一个圆形的表面,圆周上有数字和刻度,还有一个指向当前值的指针。虽然我可以让我的雇主购买第三方控件,甚至在某个地方找到免费的,但出于好奇,我仍然想自己编写它。

我的第一个想法是使用模板“剥皮”现有控件,例如 ProgressBar,因为它具有最小值、最大值和值属性。但是,我认为这不会为我提供所需的灵活性。

我想为指向当前值的指针设置动画,这样当仪表的值发生变化时,指针就会从旧值移动到新值。我认为最简单的方法是使用某种形状或几何形状来表示针,然后应用相关度数的 RotateTransform 以使针指向正确的值。动画的 To 属性将通过绑定设置为“value degree”属性。

在我看来,我可以采取三种基本方法:


使用一个自定义 FrameworkElement 来表示我可以从 FrameworkElement 派生的整个仪表,覆盖其 OnRender 方法,然后使用 DrawingContext 来绘制仪表面和针。这意味着我不能再直接使用 RotateTransform 为针设置动画,而是必须在每次值更改时重新绘制整个仪表。这对我来说似乎效率低下,因为仪表面代表了大部分绘图代码,但很少会改变。但是,就使用的元素数量而言,这种方法是最轻量级的。

使用两个自定义 FrameworkElements,一个用于面部,一个用于针
我目前倾向于这种方法。一个元素代表脸,另一个元素代表针。这将允许我使用 RotateTransform 来定位针元素。然后,仪表控件将由三个元素组成:面、针和一个面板容器来容纳它们(即画布、网格等)。所以三个元素而不是一个元素,因此不像第一种方法那么轻量级。

使用 DrawingVisuals 绘制脸部和针头
我也读过有关 DrawingVisual 类的信息,但我有点困惑,为什么有人会使用它而不是从 FrameworkElement 派生并覆盖 OnRender,因为 DrawingVisual 必须托管在无论如何自定义FrameworkElement。与第二种方法相比,这种方法似乎没有任何优势,并且需要更多代码,但也许我遗漏了一些东西。

任何关于人们认为哪种方法最好以及为什么最好的想法或建议都会受到欢迎!

4

2 回答 2

1

我个人建议使用第二种方法制作 CustomControl。除非您要同时显示超过 1000 个仪表,否则您不会注意到视觉树中的额外元素,我认为您会发现它更容易制作和维护。

于 2009-04-23T13:47:25.227 回答
1

您可以设置一个滑块控件的样式并将值输入其中。您应该能够使滑块看起来像您需要的任何类型的仪表。

于 2009-04-24T19:08:35.950 回答