void Canvas_Draw()

in ExampleGallery/ArcOptions.xaml.cs [90:162]


        void Canvas_Draw(CanvasControl sender, CanvasDrawEventArgs args)
        {
            var ds = args.DrawingSession;

            var centerPoint = (arcPoints[0] + arcPoints[1]) / 2;

            // Draw the end point markers.
            if (!ThumbnailGenerator.IsDrawingThumbnail)
            {
                for (int i = 0; i < 2; i++)
                {
                    ds.DrawCircle(arcPoints[i], hitTestRadius, (i == activeDrag) ? Colors.White : Colors.Gray);
                }
            }

            switch (CurrentOverload)
            {
                case AddArcOverload.AroundEllipse:
                    // Compute positions.
                    var ellipseRadius = (arcPoints[1] - arcPoints[0]) / 2;

                    ellipseRadius.X = Math.Abs(ellipseRadius.X);
                    ellipseRadius.Y = Math.Abs(ellipseRadius.Y);

                    float startAngle = Utils.DegreesToRadians(ArcStartAngle);
                    float sweepAngle = Utils.DegreesToRadians(ArcSweepAngle);

                    var startPoint = centerPoint + Vector2.Transform(Vector2.UnitX, Matrix3x2.CreateRotation(startAngle)) * ellipseRadius;

                    // Draw the bounding rectangle.
                    if (!ThumbnailGenerator.IsDrawingThumbnail)
                    {
                        ds.DrawRectangle(new Rect(arcPoints[0].ToPoint(), arcPoints[1].ToPoint()), Color.FromArgb(255, 64, 64, 64));
                    }

                    // Draw the arc.
                    using (var builder = new CanvasPathBuilder(sender))
                    {
                        builder.BeginFigure(startPoint);
                        builder.AddArc(centerPoint, ellipseRadius.X, ellipseRadius.Y, startAngle, sweepAngle);
                        builder.EndFigure(CanvasFigureLoop.Open);

                        using (var geometry = CanvasGeometry.CreatePath(builder))
                        {
                            ds.DrawGeometry(geometry, Colors.Yellow, strokeWidth, strokeStyle);
                        }
                    }
                    break;
             
                case AddArcOverload.PointToPoint:
                    // Display a warning if this is an invalid arc configuration.
                    bool isRadiusTooSmall = IsArcRadiusTooSmall();

                    if (isRadiusTooSmall)
                    {
                        ds.DrawText("Radius is less than the\ndistance between the\nstart and end points", centerPoint, Colors.Red, textFormat);
                    }

                    // Draw the arc.
                    using (var builder = new CanvasPathBuilder(sender))
                    {
                        builder.BeginFigure(arcPoints[0]);
                        builder.AddArc(arcPoints[1], ArcRadiusX, ArcRadiusY, Utils.DegreesToRadians(ArcRotation), ArcSweepDirection, ArcSize);
                        builder.EndFigure(CanvasFigureLoop.Open);

                        using (var geometry = CanvasGeometry.CreatePath(builder))
                        {
                            ds.DrawGeometry(geometry, isRadiusTooSmall ? Colors.Red : Colors.Yellow, strokeWidth, strokeStyle);
                        }
                    }
                    break;
            }
        }