public sealed override void Render()

in src/Avalonia.Controls/TickBar.cs [213:399]


        public sealed override void Render(DrawingContext dc)
        {
            var size = new Size(Bounds.Width, Bounds.Height);
            var range = Maximum - Minimum;
            var tickLen = 0.0d;   // Height for Primary Tick (for Minimum and Maximum value)
            var tickLen2 = 0.0d;  // Height for Secondary Tick
            var logicalToPhysical = 1.0;
            var startPoint = new Point();
            var endPoint = new Point();
            var rSpace = Orientation == Orientation.Horizontal ? ReservedSpace.Width : ReservedSpace.Height;

            // Take Thumb size in to account
            double halfReservedSpace = rSpace * 0.5;

            switch (Placement)
            {
                case TickBarPlacement.Top:
                    if (MathUtilities.GreaterThanOrClose(rSpace, size.Width))
                    {
                        return;
                    }
                    size = new Size(size.Width - rSpace, size.Height);
                    tickLen = -size.Height;
                    startPoint = new Point(halfReservedSpace, size.Height);
                    endPoint = new Point(halfReservedSpace + size.Width, size.Height);
                    logicalToPhysical = size.Width / range;
                    break;

                case TickBarPlacement.Bottom:
                    if (MathUtilities.GreaterThanOrClose(rSpace, size.Width))
                    {
                        return;
                    }
                    size = new Size(size.Width - rSpace, size.Height);
                    tickLen = size.Height;
                    startPoint = new Point(halfReservedSpace, 0d);
                    endPoint = new Point(halfReservedSpace + size.Width, 0d);
                    logicalToPhysical = size.Width / range;
                    break;

                case TickBarPlacement.Left:
                    if (MathUtilities.GreaterThanOrClose(rSpace, size.Height))
                    {
                        return;
                    }
                    size = new Size(size.Width, size.Height - rSpace);

                    tickLen = -size.Width;
                    startPoint = new Point(size.Width, size.Height + halfReservedSpace);
                    endPoint = new Point(size.Width, halfReservedSpace);
                    logicalToPhysical = size.Height / range * -1;
                    break;

                case TickBarPlacement.Right:
                    if (MathUtilities.GreaterThanOrClose(rSpace, size.Height))
                    {
                        return;
                    }
                    size = new Size(size.Width, size.Height - rSpace);
                    tickLen = size.Width;
                    startPoint = new Point(0d, size.Height + halfReservedSpace);
                    endPoint = new Point(0d, halfReservedSpace);
                    logicalToPhysical = size.Height / range * -1;
                    break;
            }

            tickLen2 = tickLen * 0.75;

            // Invert direction of the ticks
            if (IsDirectionReversed)
            {
                logicalToPhysical *= -1;

                // swap startPoint & endPoint
                var pt = startPoint;
                startPoint = endPoint;
                endPoint = pt;
            }

            var pen = new ImmutablePen(Fill?.ToImmutable(), 1.0d);

            // Is it Vertical?
            if (Placement == TickBarPlacement.Left || Placement == TickBarPlacement.Right)
            {
                // Reduce tick interval if it is more than would be visible on the screen
                double interval = TickFrequency;
                if (interval > 0.0)
                {
                    double minInterval = (Maximum - Minimum) / size.Height;
                    if (interval < minInterval)
                    {
                        interval = minInterval;
                    }
                }

                // Draw Min & Max tick
                dc.DrawLine(pen, startPoint, new Point(startPoint.X + tickLen, startPoint.Y));
                dc.DrawLine(pen, new Point(startPoint.X, endPoint.Y),
                                 new Point(startPoint.X + tickLen, endPoint.Y));

                // This property is rarely set so let's try to avoid the GetValue
                // caching of the mutable default value
                var ticks = Ticks ?? null;

                // Draw ticks using specified Ticks collection
                if (ticks?.Count > 0)
                {
                    for (int i = 0; i < ticks.Count; i++)
                    {
                        if (MathUtilities.LessThanOrClose(ticks[i], Minimum) || MathUtilities.GreaterThanOrClose(ticks[i], Maximum))
                        {
                            continue;
                        }

                        double adjustedTick = ticks[i] - Minimum;

                        double y = adjustedTick * logicalToPhysical + startPoint.Y;
                        dc.DrawLine(pen,
                            new Point(startPoint.X, y),
                            new Point(startPoint.X + tickLen2, y));
                    }
                }
                // Draw ticks using specified TickFrequency
                else if (interval > 0.0)
                {
                    for (double i = interval; i < range; i += interval)
                    {
                        double y = i * logicalToPhysical + startPoint.Y;

                        dc.DrawLine(pen,
                            new Point(startPoint.X, y),
                            new Point(startPoint.X + tickLen2, y));
                    }
                }
            }
            else  // Placement == Top || Placement == Bottom
            {
                // Reduce tick interval if it is more than would be visible on the screen
                double interval = TickFrequency;
                if (interval > 0.0)
                {
                    double minInterval = (Maximum - Minimum) / size.Width;
                    if (interval < minInterval)
                    {
                        interval = minInterval;
                    }
                }

                // Draw Min & Max tick
                dc.DrawLine(pen, startPoint, new Point(startPoint.X, startPoint.Y + tickLen));
                dc.DrawLine(pen, new Point(endPoint.X, startPoint.Y),
                                 new Point(endPoint.X, startPoint.Y + tickLen));

                // This property is rarely set so let's try to avoid the GetValue
                // caching of the mutable default value
                var ticks = Ticks ?? null;

                // Draw ticks using specified Ticks collection
                if (ticks?.Count > 0)
                {
                    for (int i = 0; i < ticks.Count; i++)
                    {
                        if (MathUtilities.LessThanOrClose(ticks[i], Minimum) || MathUtilities.GreaterThanOrClose(ticks[i], Maximum))
                        {
                            continue;
                        }
                        double adjustedTick = ticks[i] - Minimum;

                        double x = adjustedTick * logicalToPhysical + startPoint.X;
                        dc.DrawLine(pen,
                            new Point(x, startPoint.Y),
                            new Point(x, startPoint.Y + tickLen2));
                    }
                }
                // Draw ticks using specified TickFrequency
                else if (interval > 0.0)
                {
                    for (double i = interval; i < range; i += interval)
                    {
                        double x = i * logicalToPhysical + startPoint.X;
                        dc.DrawLine(pen,
                            new Point(x, startPoint.Y),
                            new Point(x, startPoint.Y + tickLen2));
                    }
                }
            }
        }