使用Silverlight做一个仪表盘控件,最好是借助Expression blend来实现。先看看这个控件的效果:

首先需要创建一个自定义控件:

它需要继承方法:OnApplyTemplate()。代码如下:
- public override void OnApplyTemplate()
- {
- base.OnApplyTemplate();
- Grid root = GetTemplateChild("LayoutRoot") as Grid;
- root.DataContext = this;
- }
我们创建了一个可视化的控件Grid,并把当前这个控件GaugeControl作为Grid的DataContext。
接下来需要完成的是自定义几个依赖属性:
显示的值(Value),最大值(Maximum)和最小值(Minimum),以及不同的量度区间(QualitativeRanges)。

例如,Value的代码:
- public double Value
- {
- get { return (double)GetValue(ValueProperty); }
- set { SetValue(ValueProperty, value); }
- }
- DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double),
- typeof(GaugeControl), new PropertyMetadata(50.0, OnValuePropertyChanged));
- private static void OnValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
- {
- ((GaugeControl)d).OnPropertyChanged("Value");
- }
接下来需要做的是创建一个Rsource文件,添加一个Style并给它设置一个名字为LayoutRoot的控件模板。

接下来是我们来用Expression Blend来打开项目,编辑这个控件模板。
首先是添加一个Grid,并在这个Grid中添加一个圆:

通过Fill和Stroke来设置圆的显示:

在圆中添加一个ItemControl,因为我们要使用数据绑定来给显示小的标记点,所以需要一个ViewModel来为这些标记点提供数据绑定:

例如:
- <ItemsControl ItemsSource="{Binding MinorTicks}"
- VerticalAlignment="Center" HorizontalAlignment="Center">
- <ItemsControl.ItemsPanel>
- <ItemsPanelTemplate>
- <Canvas/>
- </ItemsPanelTemplate>
- </ItemsControl.ItemsPanel>
- <ItemsControl.ItemTemplate>
- <DataTemplate>
- <Ellipse Fill="Black" Width="3" Height="3">
- <Ellipse.RenderTransform>
- <TransformGroup>
- <TranslateTransform X="-1.5" Y="-1.5"/>
- <TranslateTransform X="0"
- Y="{Binding Parent.GridHeight, ConverterParameter=-0.37, Converter={StaticResource ScaleFactorConverter}}"/>
- <RotateTransform Angle="{Binding Angle}"/>
- </TransformGroup>
- </Ellipse.RenderTransform>
- </Ellipse>
- </DataTemplate>
- </ItemsControl.ItemTemplate>
- </ItemsControl>
需要绑定的就是MinorTicks.它都有ViewModel提供值。
同理可以绑定大的标记点:

接下来就是指针的创建:
首先需要创建一个Grid:
然后使用Path元素来创建一个菱形并未它加上效果:
可以看这个例子学习使用path来画图:http://www.c-sharpcorner.com/UploadFile/mahesh/PathInSL03252009005946AM/PathInSL.aspx

最后一步是添加阴影效果显得更酷:

完成啦。
对于数据转换还是需要一些转换函数,比如,颜色转化为Brush:
