Colors vs BrushesFormattedText Construction and MetricsPrimary APIs:
Avalonia.Media.ColorsAvalonia.Media.BrushesColorIBrush / IImmutableSolidColorBrushFormattedTextDrawingContext.DrawText(FormattedText, Point)Important FormattedText members:
FormattedText(string, CultureInfo, FlowDirection, Typeface, double, IBrush?)FlowDirection, TextAlignment, LineHeightMaxTextWidth, SetMaxTextWidths(double[]), MaxTextHeight, MaxLineCount, TrimmingWidth, WidthIncludingTrailingWhitespace, Height, Extent, Baseline, OverhangLeading, OverhangTrailing, OverhangAfterSetForegroundBrush(...)SetFontFamily(...)SetFontSize(...)SetFontWeight(...)SetFontStyle(...)SetFontTypeface(...)SetTextDecorations(...)SetCulture(...)SetFontFeatures(...)BuildGeometry(Point)BuildHighlightGeometry(Point)BuildHighlightGeometry(Point, int, int)Reference source files:
src/Avalonia.Base/Media/Colors.cssrc/Avalonia.Base/Media/Brushes.cssrc/Avalonia.Base/Media/FormattedText.cssrc/Avalonia.Base/Media/DrawingContext.csColors vs BrushesColors gives static Color values.Brushes gives reusable immutable solid brushes (IImmutableSolidColorBrush).Use Colors when you need color math/conversion and Brushes when you need draw/fill/stroke instances.
using Avalonia.Media;
Color accent = Colors.CornflowerBlue;
IBrush textBrush = Brushes.White;
<Border xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="{DynamicResource AccentBrush}"
BorderBrush="{StaticResource CardBorderBrush}"
BorderThickness="1"
Padding="12">
<Border.Resources>
<SolidColorBrush x:Key="AccentBrush" Color="CornflowerBlue" />
<SolidColorBrush x:Key="CardBorderBrush" Color="#335A6A7A" />
</Border.Resources>
<TextBlock Foreground="White" Text="Brush resource usage" />
</Border>
Use resource keys for theme substitution instead of hardcoding many literal colors in controls.
FormattedText Construction and Metricsusing System.Globalization;
using Avalonia;
using Avalonia.Media;
FormattedText BuildTitle(string text)
{
var ft = new FormattedText(
text,
CultureInfo.CurrentUICulture,
FlowDirection.LeftToRight,
new Typeface("Inter"),
18,
Brushes.White);
ft.TextAlignment = TextAlignment.Left;
ft.MaxTextWidth = 420;
ft.Trimming = TextTrimming.CharacterEllipsis;
return ft;
}
Use metrics (Width, Height, Baseline) to align custom drawing with surrounding primitives.
FormattedText supports per-range updates without rebuilding the object.
using Avalonia.Media;
void EmphasizePrefix(FormattedText ft)
{
ft.SetFontWeight(FontWeight.Bold, 0, 4);
ft.SetForegroundBrush(Brushes.Gold, 0, 4);
ft.SetTextDecorations(TextDecorations.Underline, 0, 4);
}
This is useful for compact custom-rendered labels where full text controls are unnecessary.
In custom controls:
using System.Globalization;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Media;
public class BadgeControl : Control
{
public override void Render(DrawingContext context)
{
base.Render(context);
var ft = new FormattedText(
"LIVE",
CultureInfo.CurrentUICulture,
FlowDirection.LeftToRight,
new Typeface("Inter"),
12,
Brushes.White)
{
MaxTextWidth = Bounds.Width,
TextAlignment = TextAlignment.Center
};
context.DrawRectangle(Brushes.Crimson, null, Bounds);
context.DrawText(ft, new Point(0, (Bounds.Height - ft.Height) / 2));
}
}
Geometry extraction pattern:
using Avalonia;
using Avalonia.Media;
Geometry? BuildTextOutline(FormattedText ft)
{
return ft.BuildGeometry(new Point(0, 0));
}
BuildHighlightGeometry is useful for custom text-selection visualization.
Brushes.* for shared immutable solid brushes in code paths.FormattedText instances in tight frame loops.MaxTextWidth/MaxTextHeight before measuring when trimming behavior matters.MaxTextWidth, MaxTextHeight, and MaxLineCount interactions.Trimming is not None.FormattedText and rebuild only when text/style inputs change.#AARRGGBB semantics).