Primary WinForms APIs:
SplitterScrollableControl / Panel.AutoScrollHScrollBar, VScrollBarPrimary Avalonia APIs:
Grid + GridSplitterScrollViewer (HorizontalScrollBarVisibility, VerticalScrollBarVisibility)ScrollBar| WinForms | Avalonia |
|---|---|
Splitter with docked panels |
GridSplitter between Grid columns/rows |
Panel.AutoScroll = true |
ScrollViewer around overflowing content |
explicit HScrollBar/VScrollBar controls |
ScrollViewer scrollbars, or explicit ScrollBar only for custom scenarios |
AutoScrollPosition management |
Control.BringIntoView() and view-model driven focus/selection |
WinForms C#:
var navigation = new Panel
{
Dock = DockStyle.Left,
Width = 280,
AutoScroll = true
};
var splitter = new Splitter
{
Dock = DockStyle.Left,
Width = 6
};
var editor = new Panel
{
Dock = DockStyle.Fill,
AutoScroll = true
};
navigation.Controls.Add(BuildNavigation());
editor.Controls.Add(BuildEditor());
Controls.Add(editor);
Controls.Add(splitter);
Controls.Add(navigation);
Avalonia XAML:
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:MyApp.ViewModels"
x:DataType="vm:ShellViewModel">
<Grid ColumnDefinitions="280,6,*">
<ScrollViewer Grid.Column="0"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto">
<ItemsControl ItemsSource="{CompiledBinding NavigationItems}" />
</ScrollViewer>
<GridSplitter Grid.Column="1"
ResizeDirection="Columns"
ShowsPreview="True"
Width="6"
Background="#33000000" />
<ScrollViewer Grid.Column="2"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto">
<StackPanel Spacing="8">
<TextBlock FontWeight="Bold"
Text="{CompiledBinding SelectedTitle}" />
<ItemsControl ItemsSource="{CompiledBinding EditorSections}" />
</StackPanel>
</ScrollViewer>
</Grid>
</UserControl>
using Avalonia;
using Avalonia.Controls;
var root = new Grid
{
ColumnDefinitions = ColumnDefinitions.Parse("280,6,*")
};
var navigation = new ScrollViewer
{
HorizontalScrollBarVisibility = ScrollBarVisibility.Auto,
VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
Content = new ItemsControl
{
ItemsSource = viewModel.NavigationItems
}
};
var splitter = new GridSplitter
{
ResizeDirection = GridResizeDirection.Columns,
ShowsPreview = true,
Width = 6
};
var editor = new ScrollViewer
{
HorizontalScrollBarVisibility = ScrollBarVisibility.Auto,
VerticalScrollBarVisibility = ScrollBarVisibility.Auto,
Content = new ItemsControl
{
ItemsSource = viewModel.EditorSections
}
};
Grid.SetColumn(navigation, 0);
Grid.SetColumn(splitter, 1);
Grid.SetColumn(editor, 2);
root.Children.Add(navigation);
root.Children.Add(splitter);
root.Children.Add(editor);
GridSplitter sits in its own thin column/row and ResizeDirection matches orientation.ScrollViewer controls for the same axis.BringIntoView() on target controls after selection changes.