internal static void DrawText(this DrawingContext dc, FormattedText text, TextPosition textPosition)
 {
     //dc.DrawEllipse(Brushes.Black, null, textPosition.Point, 2, 2); // Used to debug
     if (textPosition.IsTransformed)
     {
         dc.PushTransform(textPosition.Transform);
     }
     dc.DrawText(text, textPosition.Point);
     if (textPosition.IsTransformed)
     {
         dc.Pop();
     }
 }
 protected override void OnRender(DrawingContext dc)
 {
     var arc = Arc.Fill(this.RenderSize, this.MinAngle, this.MaxAngle, this.IsDirectionReversed);
     for (int i = 0; i < this.AllTicks.Count; i++)
     {
         var tick = this.AllTicks[i];
         var text = this.AllTexts[i];
         var angle = TickHelper.ToAngle(tick, this.Minimum, this.Maximum, arc);
         var point = arc.GetPoint(angle, -this.ReservedSpace / 2 - this.TextSpace / 2);
         var textPosition = new TextPosition(text, new TextPositionOptions(this.TextOrientation, angle), point, angle);
         dc.DrawText(text, textPosition);
     }
 }
        protected override Size MeasureOverride(Size availableSize)
        {
            var bounds = new Rect();
            var midPoint = new Point(0, 0);
            var arc = new Arc(midPoint, this.MinAngle, this.MaxAngle, this.ReservedSpace, this.IsDirectionReversed);
            for (int i = 0; i < this.AllTicks.Count; i++)
            {
                var tick = this.AllTicks[i];
                var text = this.AllTexts[i];
                var angle = TickHelper.ToAngle(tick, this.Minimum, this.Maximum, arc);
                var point = arc.GetPoint(angle);
                var textPosition = new TextPosition(text, new TextPositionOptions(this.TextOrientation, angle), point, angle);
                bounds.Union(textPosition.TransformedBounds);
            }
            var points = new[] { bounds.TopLeft, bounds.TopRight, bounds.BottomRight, bounds.BottomLeft };

            this.TextSpace = 2 * points.Max(p => (p - midPoint).Length);
            return bounds.Size;
        }
 protected override void OnRender(DrawingContext dc)
 {
     if (this.Foreground == null)
     {
         return;
     }
     var line = new Line(this.ActualWidth, this.ActualHeight, this.ReservedSpace, this.Placement, this.IsDirectionReversed);
     for (int i = 0; i < this.AllTicks.Count; i++)
     {
         var tick = this.AllTicks[i];
         var pos = TickHelper.ToPos(tick, this.Minimum, this.Maximum, line);
         var text = this.AllTexts[i];
         var textPosition = new TextPosition(text, new TextPositionOptions(this.Placement, this.TextOrientation), pos, 0);
         dc.DrawText(text, textPosition);
     }
 }