Primary APIs:
TabControl, TabItem (SelectedItem, SelectedIndex, TabStripPlacement)SplitView (IsPaneOpen, DisplayMode, OpenPaneLength, CompactPaneLength, PanePlacement)Carousel (PageTransition, Next(), Previous())TransitioningContentControl for animated content swapsReference docs:
13-html-css-navigation-tabs-sidebars-breadcrumbs-and-routing-patterns.md05-html-shell-navigation-popups-and-layering-patterns.md03-html-css-animations-transitions-and-motion-system.md| HTML/CSS idiom | Avalonia mapping |
|---|---|
tablist (role="tablist") + tabpanels |
TabControl + TabItem |
off-canvas sidebar (transform: translateX(...)) |
SplitView IsPaneOpen + DisplayMode |
| CSS scroll-snap carousel | Carousel with PageTransition |
| animated route outlet | TransitioningContentControl |
HTML/CSS:
<nav class="tabs" role="tablist">
<button role="tab" aria-selected="true">Overview</button>
<button role="tab">Analytics</button>
<button role="tab">Billing</button>
</nav>
<TabControl SelectedIndex="{CompiledBinding SelectedTabIndex, Mode=TwoWay}"
TabStripPlacement="Top">
<TabItem Header="Overview" />
<TabItem Header="Analytics" />
<TabItem Header="Billing" />
</TabControl>
HTML/CSS baseline:
.sidebar {
transform: translateX(-100%);
transition: transform .2s ease;
}
.sidebar.open {
transform: translateX(0);
}
Avalonia equivalent:
<SplitView DisplayMode="CompactOverlay"
IsPaneOpen="{CompiledBinding IsNavOpen, Mode=TwoWay}"
OpenPaneLength="280"
CompactPaneLength="56"
PanePlacement="Left">
<SplitView.Pane>
<StackPanel Spacing="6">
<Button Content="Overview" />
<Button Content="Analytics" />
<Button Content="Billing" />
</StackPanel>
</SplitView.Pane>
<TransitioningContentControl Content="{CompiledBinding CurrentPageVm}" />
</SplitView>
HTML/CSS often implements carousels with scroll containers and scroll-snap-type. In Avalonia, Carousel gives selection + transition behavior directly.
<Carousel SelectedIndex="{CompiledBinding HeroIndex, Mode=TwoWay}">
<Border Padding="16"><TextBlock Text="Slide 1" /></Border>
<Border Padding="16"><TextBlock Text="Slide 2" /></Border>
<Border Padding="16"><TextBlock Text="Slide 3" /></Border>
</Carousel>
<section class="workspace">
<aside class="sidebar open">...</aside>
<main>
<nav class="tabs">...</nav>
<section class="hero-carousel">...</section>
</main>
</section>
.workspace {
display: grid;
grid-template-columns: 280px 1fr;
gap: 12px;
}
<SplitView DisplayMode="Inline"
OpenPaneLength="280"
IsPaneOpen="True">
<SplitView.Pane>
<StackPanel Spacing="6">
<Button Content="Overview" Command="{CompiledBinding GoOverviewCommand}" />
<Button Content="Analytics" Command="{CompiledBinding GoAnalyticsCommand}" />
<Button Content="Billing" Command="{CompiledBinding GoBillingCommand}" />
</StackPanel>
</SplitView.Pane>
<StackPanel Spacing="10">
<TabControl SelectedIndex="{CompiledBinding SelectedTabIndex, Mode=TwoWay}">
<TabItem Header="Overview" />
<TabItem Header="Analytics" />
<TabItem Header="Billing" />
</TabControl>
<Carousel SelectedIndex="{CompiledBinding HeroIndex, Mode=TwoWay}">
<Border Padding="16"><TextBlock Text="Revenue highlights" /></Border>
<Border Padding="16"><TextBlock Text="Retention highlights" /></Border>
<Border Padding="16"><TextBlock Text="Cost highlights" /></Border>
</Carousel>
</StackPanel>
</SplitView>
using Avalonia.Controls;
var splitView = new SplitView
{
DisplayMode = SplitViewDisplayMode.Inline,
OpenPaneLength = 280,
CompactPaneLength = 56,
IsPaneOpen = true,
Pane = new StackPanel
{
Spacing = 6,
Children =
{
new Button { Content = "Overview" },
new Button { Content = "Analytics" },
new Button { Content = "Billing" }
}
}
};
var tabs = new TabControl
{
Items =
{
new TabItem { Header = "Overview" },
new TabItem { Header = "Analytics" },
new TabItem { Header = "Billing" }
}
};
var carousel = new Carousel();
carousel.Items.Add(new Border { Padding = new Avalonia.Thickness(16), Child = new TextBlock { Text = "Revenue highlights" } });
carousel.Items.Add(new Border { Padding = new Avalonia.Thickness(16), Child = new TextBlock { Text = "Retention highlights" } });
carousel.Items.Add(new Border { Padding = new Avalonia.Thickness(16), Child = new TextBlock { Text = "Cost highlights" } });
var main = new StackPanel { Spacing = 10 };
main.Children.Add(tabs);
main.Children.Add(carousel);
splitView.Content = main;
Dispatcher.UIThread.DisplayMode choice (Overlay, CompactOverlay, CompactInline, Inline).SelectedIndex changes and items are present.