position: sticky, Scroll-Linked, and Anchor Patterns in AvaloniaPrimary APIs:
ScrollViewer offsets/snap/anchor APIsGrid for persistent header regionsReference docs:
HTML/CSS sticky:
<section class="feed">
<header class="header">Activity</header>
<div class="content">...</div>
</section>
.header { position: sticky; top: 0; z-index: 100; }
Avalonia equivalent:
<Grid RowDefinitions="Auto,*">
<Border Grid.Row="0" ZIndex="100" Classes="header" />
<ScrollViewer Grid.Row="1">
<ItemsControl ItemsSource="{CompiledBinding Items}" />
</ScrollViewer>
</Grid>
Web pattern (fade/compact toolbar on scroll) maps to observing ScrollViewer.Offset and toggling classes/properties.
void OnScrollChanged(object? s, ScrollChangedEventArgs _)
{
if (s is not ScrollViewer scrollViewer)
return;
var compact = scrollViewer.Offset.Y > 24;
Header.Classes.Set("compact", compact);
}
| Web pattern | Avalonia mapping |
|---|---|
| CSS scroll snap | ScrollViewer snap-point surface |
| anchor candidate logic | RegisterAnchorCandidate / UnregisterAnchorCandidate |
| scroll chaining/inertia toggles | attached ScrollViewer behavior options |
<section class="feed-shell">
<header class="feed-header">Activity</header>
<ul class="feed-list">
<li>...</li>
</ul>
</section>
.feed-shell { height: 100vh; overflow: auto; }
.feed-header { position: sticky; top: 0; z-index: 100; }
<Grid RowDefinitions="56,*">
<Border x:Name="Header" Grid.Row="0" Classes="feed-header" />
<ListBox Grid.Row="1"
ItemsSource="{CompiledBinding FeedItems}"
ScrollViewer.VerticalScrollBarVisibility="Auto" />
</Grid>
using Avalonia.Controls;
var shell = new Grid { RowDefinitions = RowDefinitions.Parse("56,*") };
var header = new Border();
Grid.SetRow(header, 0);
var feedList = new ListBox();
var scrollHost = new ScrollViewer
{
VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
Content = feedList
};
Grid.SetRow(scrollHost, 1);
scrollHost.ScrollChanged += (_, _) =>
{
header.Classes.Set("compact", scrollHost.Offset.Y > 24);
};
shell.Children.Add(header);
shell.Children.Add(scrollHost);