在WPF中编写自定义仪表控件的最佳方法?

时间:2009-04-23 09:01:02

标签: wpf wpf-controls

我需要在WPF中为工作中的项目编写仪表控件。通过仪表控制,我的意思是类似于传统的汽车车速表:圆周的表面,周围有数字和刻度,指针指向当前值。虽然我可以让我的雇主购买第三方控件,或者甚至在某个地方找到一个免费的控件,但我仍然喜欢自己写,因为好奇心比什么都重要。

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

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

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

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

使用两个自定义FrameworkElements,一个用于面部,一个用于针
我现在倾向于这种方法。一个元素代表面部,另一个元素代表针。这将允许我使用RotateTransform定位针元素。然后,仪表控件将由三个元素组成:面,针和用于容纳它们的Panel容器(即Canvas,Grid,等等)。所以三个元素而不是一个,因此不像第一种方法那样轻量级。

使用DrawingVisuals绘制面部和针
我也读过关于DrawingVisual类的内容,但是我有点困惑为什么有人会使用它而不是派生自FrameworkElement并重写OnRender,因为DrawingVisual必须托管在自定义FrameworkElement中。看起来这种方法与第二种方法相比没有任何优势,并且需要更多的代码,但也许我错过了一些东西。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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