calc(), clamp(), and Fluid Sizing Patterns in Avaloniapx, rem, %, viewport)calc() and Derived Sizing Patternsclamp() and Fluid Type/Layout PatternsPrimary APIs:
Width, Height, MinWidth, MaxWidth, MinHeight, MaxHeightMargin, Padding, Spacing, RowSpacing, ColumnSpacingBounds)Reference docs:
00-html-css-layout-box-model-and-positioning.md01-html-css-flexbox-grid-and-responsive-layout-recipes.md09-html-css-typography-fonts-text-flow-and-truncation.mdpx, rem, %, viewport)| CSS unit idiom | Avalonia mapping |
|---|---|
px |
device-independent pixel values (numeric XAML values) |
rem |
tokenized numeric resources (for consistent typographic scale) |
% width/height |
star sizing (*) in Grid + alignment constraints |
vw / vh |
root bounds-driven adaptive logic |
HTML/CSS:
<section class="panel">...</section>
.panel { width: 50%; padding: 1rem; }
Avalonia:
<Grid ColumnDefinitions="*,*">
<Border Grid.Column="0" Padding="16" />
</Grid>
calc() and Derived Sizing PatternsHTML/CSS:
<main class="main">...</main>
.main { width: calc(100% - 280px); }
Avalonia equivalent:
<Grid ColumnDefinitions="280,*">
<Border Grid.Column="0" Classes="sidebar" />
<Border Grid.Column="1" Classes="main" />
</Grid>
For truly computed values, compute in view model or code-behind and bind.
clamp() and Fluid Type/Layout PatternsHTML/CSS:
<h1 class="title">Ship UI faster</h1>
.title { font-size: clamp(1.5rem, 2.8vw, 3rem); }
Avalonia pattern:
FontSize.static double Clamp(double v, double min, double max) => Math.Min(max, Math.Max(min, v));
double TitleFontSizeFor(double width)
{
// Example: fluid scale with min/max caps
return Clamp(width * 0.03, 24, 48);
}
<section class="hero">
<div class="copy">
<h1>Ship UI faster</h1>
<p>One codebase across targets.</p>
</div>
<div class="visual"></div>
</section>
<Grid x:Name="Root" ColumnDefinitions="*,*" Margin="24">
<StackPanel Grid.Column="0" Spacing="10">
<TextBlock Text="Ship UI faster" FontSize="{CompiledBinding HeroTitleSize}" />
<TextBlock Text="One codebase across targets." MaxWidth="520" TextWrapping="Wrap" />
</StackPanel>
<Border Grid.Column="1" Classes="hero-visual" />
</Grid>
using System;
using Avalonia.Controls;
var root = new Grid
{
ColumnDefinitions = ColumnDefinitions.Parse("*,*"),
Margin = new Avalonia.Thickness(24)
};
var copy = new StackPanel { Spacing = 10 };
Grid.SetColumn(copy, 0);
var title = new TextBlock { Text = "Ship UI faster" };
copy.Children.Add(title);
copy.Children.Add(new TextBlock
{
Text = "One codebase across targets.",
MaxWidth = 520,
TextWrapping = TextWrapping.Wrap
});
var visual = new Border();
Grid.SetColumn(visual, 1);
root.Children.Add(copy);
root.Children.Add(visual);
void UpdateHeroTitleSize(double width) =>
title.FontSize = Math.Min(48, Math.Max(24, width * 0.03));
%-style behavior seems off.
Grid star columns/rows instead of manual width math.