【发布时间】:2009-04-23 09:01:01
【问题描述】:
我需要在 WPF 中为工作中的项目编写一个仪表控件。通过仪表控制,我的意思类似于传统的汽车速度计:一个圆形的表面,圆周上有数字和刻度,还有一个指向当前值的指针。虽然我可以让我的雇主购买第三方控件,甚至在某个地方找到免费的,但我仍然想自己编写它,出于好奇,这比其他任何事情都重要。
我的第一个想法是使用模板“剥皮”现有控件,例如 ProgressBar,因为它具有最小值、最大值和值属性。但是,我认为这不会为我提供所需的灵活性。
我想为指向当前值的指针设置动画,这样当仪表的值发生变化时,指针就会从旧值移动到新值。我认为最简单的方法是使用某种形状或几何形状来表示针,然后应用相关度数的 RotateTransform 以使针指向正确的值。动画的 To 属性将通过绑定设置为“value degree”属性。
在我看来,我可以采取三种基本方法:
使用一个自定义 FrameworkElement 来表示整个仪表
我可以从 FrameworkElement 派生,覆盖其 OnRender 方法,然后使用 DrawingContext 来绘制仪表面和针。这意味着我不能再直接使用 RotateTransform 为针设置动画,而是必须在每次值更改时重新绘制整个仪表。这对我来说似乎效率低下,因为仪表面代表了大部分绘图代码,但很少会改变。但是,就使用的元素数量而言,这种方法是最轻量级的。
使用两个自定义 FrameworkElements,一个用于面部,一个用于针
我目前倾向于这种方法。一个元素代表脸,另一个元素代表针。这将允许我使用 RotateTransform 来定位针元素。然后,仪表控件将由三个元素组成:面、针和一个面板容器来容纳它们(即画布、网格等)。所以三个元素而不是一个元素,因此不像第一种方法那么轻量级。
使用 DrawingVisuals 绘制脸部和针
我还阅读了有关 DrawingVisual 类的信息,但我有点困惑,为什么有人会使用它而不是从 FrameworkElement 派生并覆盖 OnRender,因为 DrawingVisual 无论如何都必须托管在自定义 FrameworkElement 中。与第二种方法相比,这种方法似乎没有任何优势,并且需要更多代码,但也许我遗漏了一些东西。
关于人们认为哪种方法最好以及为什么最受欢迎的任何想法或建议!
【问题讨论】:
标签: wpf wpf-controls