找回密码
 立即注册

QQ登录

只需一步,快速开始

WPF_guy

论坛元老

6

主题

23

帖子

9326

积分

论坛元老

积分
9326

活字格认证微信认证勋章元老葡萄

WPF_guy
论坛元老   /  发表于:2013-4-22 09:50  /   查看:9868  /  回复:10
用C1Gauge做一个压力表,让压力表的指针随着用户数据的变化而变化,并实现动画效果~~

跪求高手指点一下~~!

10 个回复

倒序浏览
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-4-22 17:15:00
沙发
以下几种方法共参考:
1、实现INotifyPropertyChanged接口来实现绑定
2、通过Timer在后台取用户数据然后设置为C1Gauge
回复 使用道具 举报
WPF_guy
论坛元老   /  发表于:2013-4-23 11:46:00
板凳
回复 2楼dof的帖子

想要实现个压力表的功能。现在的思路是:自定义一个类,包含两个double类型的属性,用于存放前一时刻的压力值和当前压力值,再使用DoubleAnimation来实现从前一压力值到当前压力值的动画效果。
在调试中,自定义类的DATA_former和DATA_later属性能够随Timer产生的数据进行变化,但指针仍然不动。难道是Binding出现了问题?。。。请高手指点迷津~~

贴出代码如下:

XMAL代码:
  1. <Window x:Class="Gauge4.MainWindow"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  5.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  6.         mc:Ignorable="d"
  7.         Title="MainWindow" Height="500" Width="500" xmlns:c1="http://schemas.componentone.com/winfx/2006/xaml">
  8.     <Grid Margin="20">
  9.         <c1:C1RadialGauge  Height="400" HorizontalAlignment="Left" Margin="0,0,0,0" Name="c1RadialGauge1" VerticalAlignment="Top" Width="400"
  10.                           StartAngle="-135" SweepAngle="270" Minimum="0" Maximum="10" BorderThickness="15" PointerCapFill="#FFFF9100" PointerFill="Black" PointerStroke="Black" PointerCapSize="0.08,0.08" >
  11.             <c1:C1GaugeLabel From="0" To="10" Interval="1" Location="0.88" />
  12.             <c1:C1GaugeMark From="0" To="10" Interval="1" Location="1.05"/>
  13.             <c1:C1GaugeMark From="0" To="10" Interval="0.1" Location="1.05"/>
  14.             <c1:C1RadialGauge.Triggers>
  15.                 <EventTrigger RoutedEvent="FrameworkElement.Loaded">
  16.                     <BeginStoryboard>
  17.                         <Storyboard >
  18.                             <DoubleAnimation Name="animation" Duration="0:0:1"  Storyboard.TargetName="c1RadialGauge1" Storyboard.TargetProperty="(c1:C1RadialGauge.Value)"
  19.                                              From="{Binding Path=DATA_former}" To="{Binding Path=DATA_later}" />
  20.                         </Storyboard>
  21.                     </BeginStoryboard>
  22.                 </EventTrigger>
  23.             </c1:C1RadialGauge.Triggers>
  24.             <c1:C1RadialGauge.FaceTemplate>
  25.                 <DataTemplate>
  26.                     <Grid VerticalAlignment="Stretch">
  27.                         <Grid.RowDefinitions>
  28.                             <RowDefinition Height="0.11*"/>
  29.                             <RowDefinition Height="0.88*"/>
  30.                             <RowDefinition Height="0.11*"/>
  31.                         </Grid.RowDefinitions>
  32.                         <Grid.ColumnDefinitions>
  33.                             <ColumnDefinition Width="0.11*"/>
  34.                             <ColumnDefinition Width="0.88*"/>
  35.                             <ColumnDefinition Width="0.11*"/>
  36.                         </Grid.ColumnDefinitions>
  37.                         <Path HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Stretch="Uniform" Stroke="#FF8D8D8D" Grid.Column="1" Grid.Row="1"  Fill="Black" Data="M 200.5,0.500008C 310.957,0.500008 400.5,90.0431 400.5,200.5C 400.5,310.957 310.957,400.5 200.5,400.5C 90.043,400.5 0.5,310.957 0.5,200.5C 0.5,90.0431 90.043,0.500008 200.5,0.500008 Z M 200.5,7.99992C 306.815,7.99992 393,94.1851 393,200.5C 393,306.815 306.815,393 200.5,393C 94.1852,393 8.00003,306.815 8.00003,200.5C 8.00003,94.1851 94.1852,7.99992 200.5,7.99992 Z"/>
  38.                     </Grid>
  39.                 </DataTemplate>
  40.             </c1:C1RadialGauge.FaceTemplate>

  41.         </c1:C1RadialGauge>
  42.     </Grid>
  43. </Window>
复制代码



C#代码如下:
  1. using System;
  2. using System.Windows;
  3. using System.Windows.Threading;
  4. using System.ComponentModel;

  5. namespace Gauge4
  6. {      
  7.     public partial class MainWindow : Window
  8.     {
  9.         DispatcherTimer dt;
  10.         Random rnd = new Random();
  11.         public Data data1 = new Data();  //自定义的类

  12.         public MainWindow()
  13.         {
  14.             InitializeComponent();
  15.             dt = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(1) };
  16.             dt.Tick += (s, e) => getData();
  17.             dt.Start();
  18.         }
  19.         public void getData()
  20.         {       //产生的数据存入Data类的data1实例中
  21.             double r = 10 * rnd.NextDouble();
  22.             data1.DATA_former = data1.DATA_later;   //把后一个数据移到千一个变量中,
  23.             data1.DATA_later = r;                   //再把新数据放入后一个变量
  24.         }
  25.     }

  26.     public class Data : INotifyPropertyChanged
  27.     {
  28.         //该类存2个数据:表示前后两个数据
  29.         private double data_former;
  30.         private double data_later;
  31.         public event PropertyChangedEventHandler PropertyChanged;

  32.         public double DATA_former
  33.         {
  34.             get { return data_former; }
  35.             set { data_former = value; OnPropertyChanged("DATA_former"); }
  36.         }
  37.         public double DATA_later
  38.         {
  39.             get { return data_later; }
  40.             set { data_later = value; OnPropertyChanged("DATA_later"); }
  41.         }

  42.         private void OnPropertyChanged(string name)
  43.         {
  44.             PropertyChangedEventHandler handler = PropertyChanged;
  45.             if (handler != null)
  46.             {
  47.                 handler(this, new PropertyChangedEventArgs(name));
  48.             }
  49.         }
  50.     }
  51. }
复制代码
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-4-23 19:01:00
地板
WPF_guy 你好

我们正在调试你的代码,明天会给你回复。
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-4-24 15:16:00
5#
我看了你的代码,你在后台用DispatcherTimer来修改值,其实直接修改getData方法就可以了,不需要前台的Triggers
  1.     public void getData()
  2.     {       //产生的数据存入Data类的data1实例中

  3.         double r = 10 * rnd.NextDouble();

  4.         //data1.DATA_former = data1.DATA_later;   //把后一个数据移到千一个变量中,

  5.         //data1.DATA_later = r;                   //再把新数据放入后一个变量
  6.         c1RadialGauge1.Value = r;
  7.     }
复制代码
回复 使用道具 举报
WPF_guy
论坛元老   /  发表于:2013-4-24 16:21:00
6#
回复 5楼dof的帖子

这样确实可以使指针动起来,但都是从一个值直接跳到另一个值,没有动画效果。

我本来有个思路,就是在getData()函数中实现DoubleAnimation,及对Pointer的RotateTransform属性进行动画。但试了一下,貌似组件的Pointer不支持旋转变换。
请问该如何产生动画的效果呢?
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-4-24 18:36:00
7#
动画的实现都是通过Silverlight本身具备的功能来做的,你看看MSDN中的这个章节:http://msdn.microsoft.com/zh-cn/library/cc189090(v=vs.95).aspx
回复 使用道具 举报
WPF_guy
论坛元老   /  发表于:2013-4-24 20:56:00
8#
回复 7楼dof的帖子

版主,灰常灰常滴感谢你啊~~!!
纠结了这么久,终于弄出来了!!
祝好人一生平安~~
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-4-25 11:04:00
9#
你做的控件外观很绚丽,你可以将你使用ComponentOne产品的心得写成文章,发到产品知识库中供更多的朋友参考:http://gcdn.grapecity.com/showforum-69.html
回复 使用道具 举报
WPF_guy
论坛元老   /  发表于:2013-4-25 20:59:00
10#
我已经把使用C1Gauge的经验都写出来和大家分享了:http://gcdn.grapecity.com/showtopic-8748.html
感兴趣的朋友可以去看看~~
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部