This is the second time I provide a WPF solution for a winforms problem.
Just copy and paste my code in a file -> new project -> WPF Application and see the results for yourself.
Also take a look at how simple this code really is (I'm using random values, so you can remove that and adapt it to your needs).
The drawing I used (the <Path/>
part in XAML) is not adequate for a Gauge. I just had that Path already drawn and I'm too lazy to create a new one. You should create a new drawing (I recommend using Expression Blend). But you can see the Rotation being applied and how fast it works.
using System;
using System.Threading;
using System.Windows;
using System.ComponentModel;
namespace WpfApplication4
{
public partial class Window2
{
public Window2()
{
InitializeComponent();
DataContext = new ViewModel();
}
}
public class ViewModel: INotifyPropertyChanged
{
private double _value;
public double Value
{
get { return _value; }
set
{
_value = value;
NotifyPropertyChange("Value");
}
}
private int _speed = 100;
public int Speed
{
get { return _speed; }
set
{
_speed = value;
NotifyPropertyChange("Speed");
Timer.Change(0, value);
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChange(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
private System.Threading.Timer Timer;
public ViewModel()
{
Rnd = new Random();
Timer = new Timer(x => Timer_Tick(), null, 0, Speed);
}
private void Timer_Tick()
{
Application.Current.Dispatcher.BeginInvoke((Action) (NewValue));
}
private Random Rnd;
private void NewValue()
{
Value = Value + (Rnd.Next(20) - 10);
}
}
}
XAML:
<Window x:Class="WpfApplication4.Window2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window2" WindowState="Maximized">
<DockPanel>
<StackPanel DockPanel.Dock="Top">
<TextBlock Text="Delay (MS):" Margin="2"/>
<Slider Width="200" Minimum="100" SmallChange="1" LargeChange="10" Maximum="1500" Value="{Binding Speed}" Margin="2"/>
<TextBlock Text="Current Value:" Margin="2"/>
<TextBox Text="{Binding Value}" Margin="2"/>
</StackPanel>
<Path Data="M0.95991516,0.5 L73.257382,1.866724 90.763535,1.866724 90.763535,90.822725 66.430534,90.822725 66.430534,26.075016 0.5,24.828653 z" Fill="#FF506077" RenderTransformOrigin="0.861209625003783,0.507482926584064" Stretch="Fill" Stroke="Black">
<Path.LayoutTransform>
<TransformGroup>
<ScaleTransform ScaleY="1" ScaleX="-1"/>
<SkewTransform AngleY="0" AngleX="0"/>
<RotateTransform Angle="{Binding Value}" x:Name="Rotation"/>
<TranslateTransform/>
</TransformGroup>
</Path.LayoutTransform>
</Path>
</DockPanel>
</Window>
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…