private static void OnValueChanged(DependencyObject d) { AnimatedRadialGauge radialGauge = (AnimatedRadialGauge)d; if (!double.IsNaN(radialGauge.Value)) { if (radialGauge.StepSize != 0) { radialGauge.Value = radialGauge.RoundToMultiple(radialGauge.Value, radialGauge.StepSize); } var middleOfScale = 100 - radialGauge.ScalePadding - (radialGauge.ScaleWidth / 2); var valueText = radialGauge.GetTemplateChild(ValueTextPartName) as TextBlock; radialGauge.ValueAngle = radialGauge.ValueToAngle(radialGauge.Value); // Needle if (radialGauge._needle != null) { radialGauge._needle.RotationAngleInDegrees = (float)radialGauge.ValueAngle; } // Trail var trail = radialGauge.GetTemplateChild(TrailPartName) as Path; if (trail != null) { if (radialGauge.ValueAngle > radialGauge.NormalizedMinAngle) { trail.Visibility = Visibility.Visible; if (radialGauge.ValueAngle - radialGauge.NormalizedMinAngle == 360) { // Draw full circle. var eg = new EllipseGeometry(); eg.Center = new Windows.Foundation.Point(100, 100); eg.RadiusX = 100 - radialGauge.ScalePadding - (radialGauge.ScaleWidth / 2); eg.RadiusY = eg.RadiusX; trail.Data = eg; } else { // Draw arc. var pg = new PathGeometry(); var pf = new PathFigure(); pf.IsClosed = false; pf.StartPoint = radialGauge.ScalePoint(radialGauge.NormalizedMinAngle, middleOfScale); var seg = new ArcSegment(); seg.SweepDirection = SweepDirection.Clockwise; seg.IsLargeArc = radialGauge.ValueAngle > (180 + radialGauge.NormalizedMinAngle); seg.Size = new Size(middleOfScale, middleOfScale); seg.Point = radialGauge.ScalePoint(Math.Min(radialGauge.ValueAngle, radialGauge.NormalizedMaxAngle), middleOfScale); // On overflow, stop trail at MaxAngle. pf.Segments.Add(seg); pg.Figures.Add(pf); trail.Data = pg; } } else { trail.Visibility = Visibility.Collapsed; } } // Value Text if (valueText != null) { valueText.Text = radialGauge.Value.ToString(radialGauge.ValueStringFormat); } } }