使用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:
Cheers
Nic