Primary WinForms APIs:
Control (Load, VisibleChanged, SuspendLayout, ResumeLayout, Dock, Anchor)Form (Shown, FormClosing, Dispose)Primary Avalonia APIs:
Control and Visual lifecycle (AttachedToVisualTree, DetachedFromVisualTree)TopLevel.GetTopLevel(...)Layoutable sizing/alignment propertiesGrid, DockPanel, Border, ContentControl| WinForms pattern | Avalonia mapping |
|---|---|
Form.Load |
constructor + AttachedToVisualTree for visual-root-dependent logic |
Form.Shown |
Window.Opened |
FormClosing |
Window.Closing |
Control.HandleCreated |
visual tree attachment + platform handle access via TopLevel |
SuspendLayout/ResumeLayout |
batch updates on view-model state and minimize redundant layout invalidations |
| WinForms | Avalonia |
|---|---|
Dock = Fill |
Grid cell with HorizontalAlignment="Stretch" and VerticalAlignment="Stretch" |
Anchor = Top | Right |
set HorizontalAlignment="Right" and top row placement |
Padding on containers |
Padding on Border, Panel-like controls that expose it |
AutoSize |
explicit layout sizing + content-driven measurement |
WinForms C#:
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
SuspendLayout();
var panel = new Panel { Dock = DockStyle.Fill };
var save = new Button
{
Text = "Save",
Anchor = AnchorStyles.Top | AnchorStyles.Right,
Location = new Point(680, 8)
};
save.Click += (_, _) => SaveDocument();
panel.Controls.Add(save);
Controls.Add(panel);
ResumeLayout();
}
}
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:MainViewModel">
<Grid RowDefinitions="Auto,*" ColumnDefinitions="*,Auto" Margin="8">
<Button Grid.Row="0"
Grid.Column="1"
Content="Save"
Command="{CompiledBinding SaveCommand}"
HorizontalAlignment="Right" />
</Grid>
</UserControl>
Avalonia C#:
using Avalonia;
using Avalonia.Controls;
using Avalonia.Layout;
var root = new Grid
{
RowDefinitions = RowDefinitions.Parse("Auto,*"),
ColumnDefinitions = ColumnDefinitions.Parse("*,Auto"),
Margin = new Thickness(8)
};
var save = new Button
{
Content = "Save",
Command = viewModel.SaveCommand,
HorizontalAlignment = HorizontalAlignment.Right
};
Grid.SetRow(save, 0);
Grid.SetColumn(save, 1);
root.Children.Add(save);
TopLevel from constructor to AttachedToVisualTree.