让指针动起来

这里的让指针动起来不是指拖动指针,这里指的是给仪表的指针指定SweepTime值,开启动画效果。那么当指针的value值不一样的时候,会让指针(以及绑定的装饰件)从上一个值向当前最新值变化的时候有动画效果。SweepTime的单位为秒,为大于等于0的整数值,比如SweepTime值是0,那么值的变化是瞬间完成的,没有动画效果;又比如SweepTime值是2,那么会在2秒之内完成变化的动画效果。

如果指针的值来源于数据表,可以在表格的DataColChanged事件里更新指针的值。但是往往不会在一边显示大屏的时候一边编辑表格数据,特别是后台数据库的数据发生变化的时候,也不会触发表事件。所以一般都是在窗口计时器(或者使用计划管理)里定时查询数据并更新指针的值。如果时效要求高当然也可以使用OpenQQ进行即时的数据刷新。本帮助使用计时器处理。 

首先启用窗口计时器,间隔1000,然后到TimerTick事件写代码:

1、时间

Dim gg As WinForm.Gauges = e.Form.Controls("Guages1")
Dim k = gg.BaseControl
k.CoverShapes("时间").text = Format(Date.Now, "yyyy年MM月dd日 HH:mm:ss")

2、主区弧线

把主区的主指针的SweepTime值设置为2,Value设置为0(仪表设置的Minimum),到窗口afterload事件把主指针Value设置为100(仪表设置的Maximum),这样窗口一打开,指针就会出现从最小值移动到最大值的动画效果。

但是2秒后指针就会停止,如果要让指针继续动起来,就必要在2秒后重新设置指针的Value值。前面为了显示时间,计时器间隔是1000,所以2秒的话,只需要取当前时间的秒数除以2取余数为0就更新指针值即可。

但是指针动画有个问题,只在仪表最小值和最大值之间的值变化才出现动画效果。比如最大值为100,如果我们把指针设置为120,指针到100后就会停止,并不会继续转动到120,所以我们必须先重置指针的值为最小值。

在这之前我们设计主区径向仪表的时候已经把StartAngle 设置为0,SweepAngle  设置为360,也就是说从最小值0转动到最大值100,也就是刚好从角度为0°开始转动了360°,刚好一个圆周,使得指针Value分别为最小值和最大值的时候,指针的位置都在0°角度的位置,是重叠的。

不过由于转了一圈后,指针的值为100,值再大也动不了了,这时如果指针值设置为0.会发现指针变成反转,不是想要的效果。但是前面我们也说了,如果SweepTime的值为0,指针的值会瞬间变化。所以可以利用这种特性,先把SweepTime的值改为0,然后把Value值改为0,这时从100到0,指针是瞬间变化,再加上value为0和100时位置是重叠的,所以肉眼根本看不出指针有变化。最后我们再把SweepTime的值改回2,然后把Value值再改为100,指针又愉快的旋转起来了。

更改TimerTick事件代码如下:

  1. Dim gg As WinForm.Gauges = e.Form.Controls("Guages1"'定义仪表控件  
  2. Dim k = gg.BaseControl '仪表控件的CoverShapes只能通过BaseControl引用  
  3. Dim d As Date = Date.Now  
  4. k.CoverShapes("时间").text = Format(d, "yyyy年MM月dd日 HH:mm:ss"'设置标题的时间  
  5.   
  6. '设置主区主指针的值  
  7. If d.Second Mod 2 = 0 Then '每2秒执行一次  
  8.     gg.RadialGauge.Pointer.SweepTime = 0 '禁止动画效果  
  9.     gg.RadialGauge.Value = 0 '把指针值复原为0  
  10.       
  11.     gg.RadialGauge.Pointer.SweepTime = 2 '开启动画效果  
  12.     gg.RadialGauge.Value = 100 '指针动画移动到100  
  13. End If  

效果

3、更新其它卡片的指针

其它卡片的指针值一般情况下应该根据后台获取的数据动态更新,计时器查询间隔根据自己的需要设置。这里为了测试效果,设置为每5秒更新一次。

卡片一:水球是直接绑定主指针的,直接设置

gg.Gauges(2).Value = Rand.Next(1000,8000)

卡片二:在线人数的几个项目都是绑定副指针的,给副指针赋值参考

gg.Gauges(3).MorePointers(0).Value = Rand.Next(1000, 6000)

卡片五:动态更新8个产业倾向的标题和值。这里首先要保证始终都是按数量从大到小排序的,所以前面afterload生成仪表的时候,注意给仪表的Name。以及标题的Name属性赋值,方便直接引用更改:

  1. ……  
  2.     '卡片五,从表格更新产业倾向  
  3.     Dim drs As List(Of DataRow) = DataTables("产业倾向").Select("名称 is not null""数量 desc"'获取所有项目  
  4.     Dim dr As DataRow  
  5.     Dim cp As GaugeCaption  
  6.     For i As Integer = 0 To drs.Count - 1  
  7.         dr = drs(i)  
  8.         cp = gg.Gauges("倾向_" & i).FaceShapes("标题")  
  9.         cp.Text = dr("名称")  
  10.         gg.Gauges("倾向_" & i).Value = dr("数量")  
  11.     Next  
  12. ……  

卡片四:重新生成饼图。上面卡片五的项目图形都是固定的,这种不需要重新生成,直接改其中的某些值即可。但是饼图的形状和大小都不一样的,只能重新生成。窗口Afterload已经有生成的代码,多个地方需要使用的相同代码,我们放到自定义函数里,然后使用的地方改为使用函数即可:

Functions.Execute("生成饼图", gg)