private int angleNext = 0;
private int angelCurrent = 0;
private void Canvas_MouseDown(object sender, MouseButtonEventArgs e)
{
RotateTransform rt = new RotateTransform();
rt.CenterX = 200;
rt.CenterY = 200;
Canvas canvas = (Canvas)sender;
if (dictionary.Count <= 0)
{
foreach (var item in canvas.Children)
{
if ("System.Windows.Shapes.Line".Equals(item.ToString(), StringComparison.CurrentCultureIgnoreCase))
{
var data = (Line)item;
dictionary.Add(data.Name, data);
}
else if ("System.Windows.Controls.TextBlock".Equals(item.ToString(), StringComparison.CurrentCultureIgnoreCase))
{
}
else if ("System.Windows.Controls.Path".Equals(item.ToString(), StringComparison.CurrentCultureIgnoreCase))
{
((Path)item).RenderTransform = rt;
}
}
}
//this.indicatorPin.RenderTransform = rt;
angelCurrent = angleNext;
Random random = new Random();
angleNext = random.Next(100);
double timeAnimation = Math.Abs(angelCurrent - angleNext) * 8;
DoubleAnimation da = new DoubleAnimation(angelCurrent, angleNext,
new Duration(TimeSpan.FromMilliseconds(timeAnimation)));
da.AccelerationRatio = 1;
rt.BeginAnimation(RotateTransform.AngleProperty, da);
this.currentValueTxtBlock.Text = string.Format("当前值:{0}度", angleNext);
}
private int lineNum = 0;
/// <summary>
/// 画表盘的刻度(外圈)
/// </summary>
private void ExternalScale()
{
for (double i = 0; i <= 180; i += 9)
{
//添加刻度线
Line lineScale = new Line();
var x1= 200 - 200 * Math.Cos(i * Math.PI / 180);
var y1= 200 - 200 * Math.Sin(i * Math.PI / 180);
lineScale.X1 = x1;
lineScale.Y1 = y1;
lineScale.Stroke = new SolidColorBrush(Color.FromRgb(128, 128, 129));
lineScale.StrokeThickness = 10;
lineScale.Width = 420;
lineScale.Height = 400;
lineScale.Name = "line" + lineNum;
var x2= 200 - 182 * Math.Cos(i * Math.PI / 180);
var y2= 200 - 182 * Math.Sin(i * Math.PI / 180);
lineScale.X2 = x2;
lineScale.Y2 = y2;
this.gaugeCanvas.Children.Add(lineScale);
lineNum = lineNum + 5;
}
this.DrawScale();
}
private int externalNum = 0;
/// <summary>
/// 画表盘的刻度(内圈)
/// </summary>
private void DrawScale()
{
for (double i = 0; i <= 180; i += 6)
{
Ellipse ellipse = new Ellipse();
if (Convert.ToInt32(i) % 18 == 0)
{
ellipse.Width = 10;
ellipse.Height = 10;
ellipse.Stroke = new SolidColorBrush(Color.FromRgb(227, 227, 226));
ellipse.StrokeThickness = 1;
ellipse.Fill = new SolidColorBrush(Color.FromRgb(227, 227, 226));
ellipse.SetValue(Canvas.LeftProperty, 200 - 160 * Math.Cos(i * Math.PI / 180));
ellipse.SetValue(Canvas.TopProperty, 200 - 160 * Math.Sin(i * Math.PI / 180) - 4.5);
//添加刻度值
TextBlock txtScale = new TextBlock();
txtScale.Text = Convert.ToString(externalNum);
txtScale.FontSize = 10;
if (i <= 90) //对坐标值进行一定的修正
{
Canvas.SetLeft(txtScale, 200 - 145 * Math.Cos(i * Math.PI / 180));
}
else
{
Canvas.SetLeft(txtScale, 190 - 145 * Math.Cos(i * Math.PI / 180));
}
Canvas.SetTop(txtScale, 200 - 145 * Math.Sin(i * Math.PI / 180));
this.gaugeCanvas.Children.Add(txtScale);
externalNum = externalNum + 10;
}
else
{
ellipse.Width = 7;
ellipse.Height = 7;
if (i <= 90)
{
ellipse.SetValue(Canvas.LeftProperty, 200 - 158 * Math.Cos(i * Math.PI / 180));
ellipse.SetValue(Canvas.TopProperty, 200 - 158 * Math.Sin(i * Math.PI / 180) - 4.5);
}
else if (i > 160)
{
ellipse.SetValue(Canvas.LeftProperty, 200 - 162 * Math.Cos(i * Math.PI / 180));
ellipse.SetValue(Canvas.TopProperty, 200 - 162 * Math.Sin(i * Math.PI / 180) - 4.5);
}
else
{
ellipse.SetValue(Canvas.LeftProperty, 200 - 160 * Math.Cos(i * Math.PI / 180));
ellipse.SetValue(Canvas.TopProperty, 200 - 160 * Math.Sin(i * Math.PI / 180) - 4.5);
}
ellipse.Stroke = new SolidColorBrush(Color.FromRgb(227, 227, 226));
ellipse.StrokeThickness = 1;
ellipse.Fill = new SolidColorBrush(Color.FromRgb(227, 227, 226));
}
this.gaugeCanvas.Children.Add(ellipse);
}
this.DrawPointer();
}
/// <summary>
/// 画指针
/// </summary>
private void DrawPointer()
{
PathFigure pathFigure = new PathFigure()
{
StartPoint = new Point(200.00, 195.00),
IsClosed = true
};
PathSegmentCollection pathSegmentCollection = new PathSegmentCollection();
LineSegment lineSegment = new LineSegment(new Point(20, 200), true);
pathSegmentCollection.Add(lineSegment);
LineSegment lineSegment1 = new LineSegment(new Point(200, 205), true);
pathSegmentCollection.Add(lineSegment1);
pathFigure.Segments = pathSegmentCollection;
PathFigureCollection myPathFigureCollection = new PathFigureCollection();
myPathFigureCollection.Add(pathFigure);
PathGeometry pathGeometry = new PathGeometry();
pathGeometry.Figures = myPathFigureCollection;
//this.indicatorPin.Data = pathGeometry;
Path path = new Path();
path.Name = "indicatorPin";
path.Fill = new SolidColorBrush(Color.FromRgb(239, 191, 79));
path.Data = pathGeometry;
this.gaugeCanvas.Children.Add(path);
}前台代码:
<Canvas x:Name="gaugeCanvas" Margin="20" MouseDown="Canvas_MouseDown"> <TextBlock x:Name="currentValueTxtBlock" FontSize="20" Canvas.Left="140" Canvas.Top="150"/> </Canvas>
评论区