Primary WinForms APIs:
SplitContainer (Orientation, SplitterDistance, Panel1MinSize, Panel2MinSize)IsMdiContainer, MdiParent, MdiChildren)Primary Avalonia APIs:
Grid + GridSplitterSplitViewTabControl for document-like shellsWindow top-levels when neededWinForms SplitContainer |
Avalonia |
|---|---|
Orientation = Vertical |
Grid ColumnDefinitions="*,Auto,*" + vertical GridSplitter |
Orientation = Horizontal |
Grid RowDefinitions="*,Auto,*" + horizontal GridSplitter |
Panel1MinSize/Panel2MinSize |
MinWidth/MinHeight on hosted panels |
SplitterDistance |
initial star/absolute column or row sizing |
Avalonia has no built-in MDI container equivalent. Preferred replacements:
TabControl + document view-model collection,Dock library integration when advanced docking is required,Window instances.WinForms C#:
var split = new SplitContainer
{
Dock = DockStyle.Fill,
Orientation = Orientation.Vertical,
SplitterDistance = 320,
Panel1MinSize = 220,
Panel2MinSize = 300
};
split.Panel1.Controls.Add(new TreeView { Dock = DockStyle.Fill });
split.Panel2.Controls.Add(new TabControl { Dock = DockStyle.Fill });
Controls.Add(split);
Avalonia XAML:
<Grid xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:MyApp.ViewModels"
x:DataType="vm:WorkspaceShellViewModel"
ColumnDefinitions="320,6,*">
<TreeView Grid.Column="0"
MinWidth="220"
ItemsSource="{CompiledBinding NavigationItems}" />
<GridSplitter Grid.Column="1"
Width="6"
ResizeDirection="Columns"
ResizeBehavior="PreviousAndNext" />
<TabControl Grid.Column="2"
MinWidth="300"
ItemsSource="{CompiledBinding Documents}"
SelectedItem="{CompiledBinding SelectedDocument}" />
</Grid>
using Avalonia.Controls;
var shell = new Grid
{
ColumnDefinitions = ColumnDefinitions.Parse("320,6,*")
};
var nav = new TreeView { MinWidth = 220, ItemsSource = viewModel.NavigationItems };
Grid.SetColumn(nav, 0);
var splitter = new GridSplitter
{
Width = 6,
ResizeDirection = GridResizeDirection.Columns,
ResizeBehavior = GridResizeBehavior.PreviousAndNext
};
Grid.SetColumn(splitter, 1);
var docs = new TabControl { MinWidth = 300, ItemsSource = viewModel.Documents };
Grid.SetColumn(docs, 2);
shell.Children.Add(nav);
shell.Children.Add(splitter);
shell.Children.Add(docs);
ResizeBehavior="PreviousAndNext" and ensure adjacent definitions exist.