//Change percentage private static void OnPercentageChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { double newPercent = (double)e.NewValue; GradientProgressRing rainbowLoader = (GradientProgressRing)sender; rainbowLoader.Percentage = newPercent; int roundState = (Convert.ToInt32(rainbowLoader.Percentage * 3.6)); Point startpt = new Point(100, 100); rainbowLoader.CanvasPath.Children.Clear(); for (int i = 0; i < roundState; i++) { //figure var xFigure = new PathFigure(); xFigure.StartPoint = startpt; var xPathSegmentCollection = new PathSegmentCollection(); //out var xOut = new LineSegment(); xOut.Point = new Point(50 * Math.Cos(Math.PI * i / 180) + 100, 50 * Math.Sin(Math.PI * i / 180) + 100); xPathSegmentCollection.Add(xOut); Point ArcStart = new Point(50 * Math.Cos(Math.PI * (i + 2) / 180) + 100, 50 * Math.Sin(Math.PI * (i + 2) / 180) + 100); //arc var xArc = new ArcSegment(ArcStart, new Size(10, 10), 0, false, SweepDirection.Clockwise, false); xPathSegmentCollection.Add(xArc); //in var xIn = new LineSegment(); xIn.Point = startpt; xPathSegmentCollection.Add(xIn); xFigure.Segments = xPathSegmentCollection; var xFigureCollection = new PathFigureCollection(); xFigureCollection.Add(xFigure); var xPathGeometry = new PathGeometry(xFigureCollection); Path xPath = new Path(); xPath.Data = xPathGeometry; int d = Convert.ToInt32(i); xPath.Fill = new SolidColorBrush(rainbowLoader.getHSV(i)); rainbowLoader.CanvasPath.Children.Add(xPath); } }