Primary APIs:
Control.Render(DrawingContext)DrawingContext drawing methods (DrawLine, DrawGeometry, DrawRectangle, DrawEllipse, DrawText, DrawGlyphRun)DrawingContext.Custom(ICustomDrawOperation)ICustomDrawOperationFormattedTextTextLayoutGlyphRunShape and derived controls (Rectangle, Ellipse, Path, Line, etc.)ISkiaSharpApiLeaseFeatureAvalonia.Skia.Helpers.DrawingContextHelperReference source files:
src/Avalonia.Base/Media/DrawingContext.cssrc/Avalonia.Base/Rendering/SceneGraph/CustomDrawOperation.cssrc/Avalonia.Base/Media/FormattedText.cssrc/Avalonia.Base/Media/TextFormatting/TextLayout.cssrc/Avalonia.Base/Media/GlyphRun.cssrc/Avalonia.Controls/Shapes/Shape.cssrc/Skia/Avalonia.Skia/ISkiaSharpApiLeaseFeature.cssrc/Skia/Avalonia.Skia/Helpers/DrawingContextHelper.cssamples/RenderDemo/Pages/CustomSkiaPage.csUse Render(DrawingContext context) for direct immediate-mode drawing:
public sealed class ChartSurface : Control
{
public override void Render(DrawingContext context)
{
base.Render(context);
context.DrawRectangle(Brushes.Black, null, new Rect(Bounds.Size));
context.DrawLine(new Pen(Brushes.Lime, 2), new Point(0, Bounds.Height), new Point(Bounds.Width, 0));
}
}
Use ICustomDrawOperation when you need backend-specific access (for example Skia lease features).
Pattern:
Bounds, HitTest, Render, and Dispose.context.Custom(op).public override void Render(DrawingContext context)
{
context.Custom(new MyCustomDrawOp(new Rect(Bounds.Size)));
}
From the sample, inside custom op:
context.TryGetFeature<ISkiaSharpApiLeaseFeature>()SKCanvasUse:
FormattedText for simpler formatted text scenariosTextLayout for multiline measurement/hit-testing and advanced flowGlyphRun for low-level text rendering and custom glyph operationsTypical flow for advanced text:
TextLayout with typeface, size, wrapping, trimming.Width, Height, Baseline, etc.).TextLayout.Draw(context, origin).HitTestTextPosition, ranges).Use built-in shape controls when possible:
Shape.FillShape.StrokeShape.StrokeThicknessShape.StrokeDashArrayShape.StretchShape.Render ultimately draws geometry with DrawingContext.DrawGeometry.
Guidance:
Render only for highly specialized visuals.if (context.TryGetFeature<ISkiaSharpApiLeaseFeature>(out var leaseFeature))
{
using var lease = leaseFeature.Lease();
var canvas = lease.SkCanvas;
// Skia drawing here
}
Use helper:
Avalonia.Skia.Helpers.DrawingContextHelper.RenderAsync(SKCanvas, Visual, Rect, dpi)This is useful when rendering into non-Avalonia canvas hosts.
Render allocation-light.Bounds may be zero.ISkiaSharpApiLeaseFeature.ImmediateDrawingContext.TextLayout metrics and avoid ad-hoc baseline math.InvalidateVisual without throttling.Default mode:
XAML-first references:
Shape controls (Path, Rectangle, Ellipse)XAML-first usage example:
<Grid xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MyApp.Controls">
<Path Stroke="DodgerBlue"
StrokeThickness="2"
Data="M 10,10 L 110,10 110,60 Z" />
<local:ChartSurface Width="320" Height="180" />
</Grid>
Code-only alternative (on request):
var surface = new ChartSurface
{
Width = 320,
Height = 180
};