Avalonia is in general very similar to WPF, but you will find differences. Here are the most common:
- Styling
- DataTemplates
- HierachicalDataTemplate.md
- UIElement, FrameworkElement and Control
- DependencyProperty
- Grid
- ItemsControl
- Tunnelling Events
- Class Handlers
- PropertyChangedCallback
- RenderTransforms & RenderTransformorigin
Dispatcher changes
If you use Application.Current.Dispatcher
, you should use Dispatcher.UIThread
instead which provide similar facilities.
WPF
Application.Current.Dispatcher.InvokeAsync(handler, DispatcherPriority.Background);
Avalonia
Dispatcher.UIThread.InvokeAsync(handler, DispatcherPriority.Background);
If you previously access dispatcher on the control itself, you should use global static instance Dispatcher.UIThread
too.
WPF
this.Dispatcher.InvokeAsync(handler, DispatcherPriority.Background);
Avalonia
Dispatcher.UIThread.InvokeAsync(handler, DispatcherPriority.Background);
In more details, it's explained in the Accessing the UI thread article.
Visibility of elements
WPF has uses Visibility
property which can be Collapsed
, Hidden
or Visible
. Avalonia uses simpler and more intuitive model bool IsVisible
.
Binding
WPF
<TextBox Name="MyTextbox" Text="{Binding ElementName=searchTextBox, Path=Text}"" />
Avalonia
<TextBox Name="MyTextbox" Text="{Binding #searchTextBox.Text}" />
Handling attachment to visual tree
There no events like Loaded
/Unloaded
in Avalonia, but you can override OnAttachedToVisualTree
/OnDetachedFromVisualTree
on the control, to know when control attached to virtual tree, or detatched from it. Alternatively you can use TemplateApplied
instead of Loaded
event.
WPF
Unloaded += OnControl_Unloaded;
Loaded += OnControl_Loaded;
private void OnControl_Loaded(object sender, RoutedEventArgs e)
{
// Handle control loaded event.
}
private void OnControl_Unloaded(object sender, RoutedEventArgs e)
{
// Handle control unload event.
}
Avalonia
TemplateApplied += OnControl_Loaded;
private void OnControl_Loaded(object sender, RoutedEventArgs e)
{
}
// or
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
{
// Handle control loaded event.
}
// Use this instead of Unloaded event.
protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
{
// Handle control unload event.
}
That mean that you cannot subscribe to tree attachment/detachment events for other controls.
Tooltips
Avalonia controls does not have ToolTip
property like WPF. Instead you should use ToolTip.Tip
WPF
<Button ToolTip="Save file as..." />
Avalonia
<Button ToolTip.Tip="Save file as..." />
TextRun decorations
WPF
TextRunProperties.SetTextDecorations(TextDecorations.Underline);
Avalonia
TextRunProperties.Underline = true;