在项目中,由于使用到了活动积温运算,也就是指当日平均气温稳定上升到10℃以上时,大多数农作物才能活跃生长。把大于等于10℃持续期内的日平均气温累加起来,得到的气温总和,叫做活动积温。所以我决定采用dojo的原生仪表盘的图片素材进行封装,作出一个silverlight版本来。下面是其界面截图和具体的调用方法:

调用方法如下:

   1:                  Data d = new Data();
   2:                  d.Val = 40;
   3:   
   4:                  var uc = new ChartControl(d);
   5:                  Test.Children.Add(uc);

由于本控件做的比较仓促,所以XAML代码并未加以清理,还请各位看官凑合这看吧。

   1:  <UserControl x:Class="TinyFrame.Silverlight.ChartControl"
   2:      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
   5:      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
   6:      xmlns:converter="clr-namespace:TinyFrame.Silverlight"   
   7:      mc:Ignorable="d"
   8:      Loaded="UserControl_Loaded"
   9:      d:DesignHeight="248" d:DesignWidth="400">
  10:      
  11:      <UserControl.Resources>
  12:          <converter:RotationConverter x:Name="RConverter" />
  13:      </UserControl.Resources>
  14:      
  15:      <Grid Background="White" x:Name="Grid" Height="236" Width="385">
  16:          <Border BorderBrush="Green" CornerRadius="5" BorderThickness="3">
  17:              <Grid>
  18:          <Image HorizontalAlignment="Left" Margin="17,19,0,0" Width="200" Source="Image/chart.png" Stretch="Fill" Height="200" VerticalAlignment="Top" />
  19:          <Image x:Name="RImg"  HorizontalAlignment="Left" Margin="112,52,0,0" Width="9" Source="Image/chart-pointer.png" Stretch="Fill" Height="132" VerticalAlignment="Top" RenderTransformOrigin="0.5,0.5">
  20:              <Image.RenderTransform>
  21:                  <TransformGroup>
  22:                      <ScaleTransform/>
  23:                      <SkewTransform/>
  24:                      <RotateTransform x:Name="MyRotation" Angle="{Binding Val, Converter={StaticResource RConverter}}"/>
  25:                      <TranslateTransform/>
  26:                  </TransformGroup>
  27:              </Image.RenderTransform>
  28:          </Image>
  29:          <TextBlock Text="{Binding Val}" Height="17" HorizontalAlignment="Left" Margin="92,166,0,0" Name="textBlock1"  VerticalAlignment="Top" Width="50" TextAlignment="Center" />
  30:          <Border BorderBrush="#BCCBD7" BorderThickness="1" Height="200" CornerRadius="5,5,0,0" Margin="223,19,13,0" Name="border1" VerticalAlignment="Top">
  31:              <Grid Width="142">
  32:                  <Border BorderBrush="#BCCBD7" BorderThickness="0,0,0,1" CornerRadius="5,5,0,0" Height="24" HorizontalAlignment="Left" Margin="-1,0,0,0" Name="border2" VerticalAlignment="Top" Width="148">
  33:                      <Border.Background>
  34:                          <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
  35:                              <GradientStop Color="#BCCBD7"/>
  36:                              <GradientStop Color="#FFFFFF" Offset="1"/>
  37:                          </LinearGradientBrush>
  38:                      </Border.Background>
  39:                      <TextBlock Height="23"  Name="textBlock2" Text="活动积温" TextAlignment="Center" VerticalAlignment="Center" Foreground="Green" FontSize="14" FontWeight="Bold" Width="102" />
  40:                  </Border>
  41:                  <TextBlock Height="98" Foreground="Green" HorizontalAlignment="Left"  Margin="6,30,0,0" Name="textBlock3" Text="当日平均气温稳定上升到10℃以上时,大多数农作物才能活跃生长。把大于等于10℃持续期内的日平均气温累加起来,得到的气温总和,叫做活动积温。" VerticalAlignment="Top" Width="135" TextWrapping="Wrap" />
  42:                  <Button Content="同比活动积温" Height="23" Foreground="Green" HorizontalAlignment="Left" Margin="6,140,0,0" Name="button1" VerticalAlignment="Top" Width="130" />
  43:                          <Button Content="环比活动积温" Height="23" Foreground="Green" HorizontalAlignment="Left" Margin="6,169,0,0" Name="button2" VerticalAlignment="Top" Width="130" />
  44:              </Grid>
  45:          </Border>
  46:              </Grid>
  47:          </Border>
  48:      </Grid>
  49:  </UserControl>

后台代码如下:

   1:  using System.Windows.Controls;
   2:  using System.ComponentModel;
   3:  using System.Windows.Threading;
   4:   
   5:  namespace TinyFrame.Silverlight
   6:  {
   7:      public partial class ChartControl : UserControl
   8:      {
   9:          public ChartControl(Data data)
  10:          {
  11:              InitializeComponent();
  12:              this.data = data;
  13:              Grid.DataContext = data;
  14:          }
  15:   
  16:          private Data data;
  17:          private DispatcherTimer timer;
  18:          private static double temp;
  19:      }
  20:   
  21:      public class Data:INotifyPropertyChanged
  22:      {
  23:          /*转30゜的角,表盘上的区间是 动了10
  24:          0  刻度对应的角是 -150゜
  25:          10 刻度对应的角是 -120゜
  26:          20 刻度对应的角是 -90゜
  27:          ...
  28:          100刻度对应的角是  150゜
  29:          刻度数(x)转角度数(y): x = -150+3y;
  30:          角度数(y)转刻度数(x): y = x/3 +50;
  31:          */
  32:          private double val = 0;
  33:          public double Val
  34:          {
  35:              get
  36:              {
  37:                  return val;
  38:              }
  39:              set
  40:              {
  41:                  if(val!=value)
  42:                  {
  43:                      preVal = val;
  44:   
  45:                      val=value;
  46:                      Notify("Val");
  47:                  }
  48:              }
  49:          }
  50:   
  51:          private double preVal;
  52:          public double PreVal
  53:          {
  54:              get
  55:              {
  56:                  return preVal;
  57:              }
  58:              set
  59:              {
  60:                  if (preVal != value)
  61:                  {
  62:                      preVal = value;
  63:                      Notify("PreVal");
  64:                  }
  65:              }
  66:          }
  67:   
  68:          public event PropertyChangedEventHandler PropertyChanged;
  69:   
  70:          public void Notify(string propertyName)
  71:          {
  72:              if (PropertyChanged != null)
  73:                  PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  74:          }
  75:      }
  76:  }

由于用户输入的当前积温值(X)和刻度值(Y)有如下的对应关系:X=-150+3*Y,所以这里我们需要进行一下值的转换,就是让用户输入当前积温值的时候,能够自动转换为表盘需要转的度数,这里我们采用Value Converter来实现:

   1:  using System;
   2:  using System.Windows.Data;
   3:  using System.Globalization;
   4:   
   5:  namespace TinyFrame.Silverlight
   6:  {
   7:      public class RotationConverter:IValueConverter
   8:      {
   9:          public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  10:          {
  11:              if (value != null)
  12:                  return -150 + 3 * double.Parse(value.ToString());
  13:              return null;
  14:          }
  15:   
  16:          public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  17:          {
  18:              return null;
  19:          }
  20:      }
  21:  }

在XAML中,我们这样使用,就可以了:

   1:  <Image.RenderTransform>
   2:     <TransformGroup>
   3:         <ScaleTransform/>
   4:         <SkewTransform/>
   5:         <RotateTransform x:Name="MyRotation" Angle="{Binding Val, Converter={StaticResource RConverter}}"/>
   6:         <TranslateTransform/>
   7:      </TransformGroup>
   8:  </Image.RenderTransform>

最后附上代码下载:

点击这里下载

Silverlight自定义控件开发:仪表盘的更多相关文章

  1. Silverlight自定义控件开发:温度计

    由于在实际项目中需要实时显示采集到的空气温湿度,土壤温湿度值,需要用比较显眼并且清楚明了的方式来展示,这里我们准备采用温度计的方式来进行.一方面是因为大家都熟悉这个,知道怎么去看:同时,温度计本身也比 ...

  2. iOS 自定义控件开发(中)

    <iOS 自定义控件开发(上)> <iOS 自定义控件开发(中)> 接上篇iOS自定义控件开发之后,我们尝试另外一种. 在Xcode的右边,会看到如下的图 其中,上面有一个:C ...

  3. iOS 自定义控件开发(上)

    工作需要,最近在进行iOS方面的图表工作.找了很多第三方库都无法实现效果,所以决定自己写一个控件. <iOS 自定义控件开发(上)> <iOS 自定义控件开发(中)> #0 目 ...

  4. C#自定义控件开发

    自定义控件开发 一般而言,Visual Studio 2005中自带的几十种控件已经足够我们使用了,但是,在一些特殊的需求中,可能需要一些特殊的控件来与用户进行交互,这时,就需要我们自己开发新的.满足 ...

  5. Qt自定义控件之仪表盘2--QPaint绘制仪表盘

    0.前言 前面一篇文章写道了仪表盘的特点,实现了一个贴图的仪表盘,属于低配版本的仪表盘.    主要是有任何改动时候就需要重新设计图片,不能适配不同控件大小,即使让它自由拉伸,但仪表盘放大缩小时候显示 ...

  6. Qt自定义控件之仪表盘3--雷达扫描图

    1.设计思想 雷达扫描图,在影视作品中见到较多,比如飞机雷达.舰艇雷达,有一个扫描线转圈代表雷达一周旋转或一个批次的收发,发现目标就在表盘上标记位置.和汽车仪表盘类似,汽车仪表盘有底盘背景图.同圆.刻 ...

  7. .Net语言 APP开发平台——Smobiler学习日志:如何在手机上开发仪表盘控件

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的"S ...

  8. 自定义控件开发的调试及DesignMode的状态处理

    在开发Winform程序的时候,我们往往需要根据需要做一些自定义的控件模块,这样可以给系统模块重复利用,或者实现更好的效果等功能.但在使用的时候,我们又往往设计时刻发现一些莫名其妙的错误,那么我们该如 ...

  9. ZLComboBox自定义控件开发详解

    [引言]距离上一回写博客已经有一些时日了,之前的爱莲iLinkIT系列主要是讲解了如何用NodeJS来实现一个简单的“文件传送”软件,属于JavaScript中在服务器端的应用. 今天,我们就回归到J ...

随机推荐

  1. 【原】iOS下KVO使用过程中的陷阱

    KVO,全称为Key-Value Observing,是iOS中的一种设计模式,用于检测对象的某些属性的实时变化情况并作出响应.网上广为流传普及的一个例子是利用KVO检测股票价格的变动,例如这里.这个 ...

  2. iOS:交换Button中图片与文字的左右位置

    titleEdgeInsets属性和 imageEdgeInsets属性只是在画这个button出来的时候用来调整image和label位置的属性,并不影响button本身的大小.它们只是image和 ...

  3. iTerm和Alfred 2的安装和使用

    小贴士:本博文所有的下载资源都在文章末尾 当你下载好所有需要的资源之后,就可以安装这两个装逼神器了: iTerm的安装和使用 首先是安装终端相关的装逼神器 先把archey拷贝到bin目录下,补充图示 ...

  4. 我的mac上的软件(以防优盘重装系统使用)

     

  5. [VMware]设置VM虚拟机随系统自动启动

    设置步骤: 1.找到VM的安装路径,右键vmware发送到桌面快捷方式 2.右键桌面快捷方式的属性,看到目标的属性框 3.找到需要自启动的虚拟机路径,如: D:\QC_VM\Clone of Wind ...

  6. 对石家庄铁道大学网站首页进行UI分析

    对石家庄铁道大学网站首页进行UI界面分析首先,铁道大学的网页首页分为图文热点,学校新闻,校内公告,媒体看铁大,学术咨询等等模块.通过分析这些模块,可以看出,学校网站首页针对的使用对象有很多,包括学校领 ...

  7. C#程序调用cmd执行命令

    对于C#通过程序来调用cmd命令的操作,网上有很多类似的文章,但很多都不行,竟是漫天的拷贝.我自己测试整理了一下. 代码: string str = Console.ReadLine(); Syste ...

  8. VISUAL STUDIO 调试

    调试术语 Visual Studio调试之断点基础篇 Visual Studio调试之断点进阶篇 不能设置断点的检查步骤 Visual Studio调试之断点技巧篇 Visual Studio调试之断 ...

  9. CentOS 升级内核

    因为要安装go,尝试升级内核到 2.6.32.61,出现了一些问题,参考如下文档,多谢各位 http://liaozy.blog.51cto.com/921527/553921 http://www. ...

  10. C语言流程控制

    顺序结构 顺序结构是最常用的结构,即从上到下的执行语句. int num=5; num++; num=13; 条件结构 条件结构是当表达式为真的时候执行语句块,C语言提供了两种条件结构 if...el ...