回复 2楼dof的帖子
想要实现个压力表的功能。现在的思路是:自定义一个类,包含两个double类型的属性,用于存放前一时刻的压力值和当前压力值,再使用DoubleAnimation来实现从前一压力值到当前压力值的动画效果。
在调试中,自定义类的DATA_former和DATA_later属性能够随Timer产生的数据进行变化,但指针仍然不动。难道是Binding出现了问题?。。。请高手指点迷津~~
贴出代码如下:
XMAL代码:
- <Window x:Class="Gauge4.MainWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- mc:Ignorable="d"
- Title="MainWindow" Height="500" Width="500" xmlns:c1="http://schemas.componentone.com/winfx/2006/xaml">
- <Grid Margin="20">
- <c1:C1RadialGauge Height="400" HorizontalAlignment="Left" Margin="0,0,0,0" Name="c1RadialGauge1" VerticalAlignment="Top" Width="400"
- StartAngle="-135" SweepAngle="270" Minimum="0" Maximum="10" BorderThickness="15" PointerCapFill="#FFFF9100" PointerFill="Black" PointerStroke="Black" PointerCapSize="0.08,0.08" >
- <c1:C1GaugeLabel From="0" To="10" Interval="1" Location="0.88" />
- <c1:C1GaugeMark From="0" To="10" Interval="1" Location="1.05"/>
- <c1:C1GaugeMark From="0" To="10" Interval="0.1" Location="1.05"/>
- <c1:C1RadialGauge.Triggers>
- <EventTrigger RoutedEvent="FrameworkElement.Loaded">
- <BeginStoryboard>
- <Storyboard >
- <DoubleAnimation Name="animation" Duration="0:0:1" Storyboard.TargetName="c1RadialGauge1" Storyboard.TargetProperty="(c1:C1RadialGauge.Value)"
- From="{Binding Path=DATA_former}" To="{Binding Path=DATA_later}" />
- </Storyboard>
- </BeginStoryboard>
- </EventTrigger>
- </c1:C1RadialGauge.Triggers>
- <c1:C1RadialGauge.FaceTemplate>
- <DataTemplate>
- <Grid VerticalAlignment="Stretch">
- <Grid.RowDefinitions>
- <RowDefinition Height="0.11*"/>
- <RowDefinition Height="0.88*"/>
- <RowDefinition Height="0.11*"/>
- </Grid.RowDefinitions>
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="0.11*"/>
- <ColumnDefinition Width="0.88*"/>
- <ColumnDefinition Width="0.11*"/>
- </Grid.ColumnDefinitions>
- <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"/>
- </Grid>
- </DataTemplate>
- </c1:C1RadialGauge.FaceTemplate>
- </c1:C1RadialGauge>
- </Grid>
- </Window>
复制代码
C#代码如下:
- using System;
- using System.Windows;
- using System.Windows.Threading;
- using System.ComponentModel;
- namespace Gauge4
- {
- public partial class MainWindow : Window
- {
- DispatcherTimer dt;
- Random rnd = new Random();
- public Data data1 = new Data(); //自定义的类
- public MainWindow()
- {
- InitializeComponent();
- dt = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(1) };
- dt.Tick += (s, e) => getData();
- dt.Start();
- }
- public void getData()
- { //产生的数据存入Data类的data1实例中
- double r = 10 * rnd.NextDouble();
- data1.DATA_former = data1.DATA_later; //把后一个数据移到千一个变量中,
- data1.DATA_later = r; //再把新数据放入后一个变量
- }
- }
- public class Data : INotifyPropertyChanged
- {
- //该类存2个数据:表示前后两个数据
- private double data_former;
- private double data_later;
- public event PropertyChangedEventHandler PropertyChanged;
- public double DATA_former
- {
- get { return data_former; }
- set { data_former = value; OnPropertyChanged("DATA_former"); }
- }
- public double DATA_later
- {
- get { return data_later; }
- set { data_later = value; OnPropertyChanged("DATA_later"); }
- }
- private void OnPropertyChanged(string name)
- {
- PropertyChangedEventHandler handler = PropertyChanged;
- if (handler != null)
- {
- handler(this, new PropertyChangedEventArgs(name));
- }
- }
- }
- }
复制代码 |