Primary WPF APIs:
Trigger, MultiTrigger, DataTriggerVisualStateManager and storyboard-driven statesPrimary Avalonia patterns:
:pointerover, :pressed, :checked, :disabled)Classes.someState)| WPF | Avalonia |
|---|---|
property trigger (IsMouseOver) |
pseudo-class selector (:pointerover) |
| multi-trigger | combined selectors and explicit class-state modeling |
| data trigger | bind boolean to Classes.<name> then style by class |
VisualStateManager groups |
template state classes + transitions/animations |
WPF XAML:
<Style TargetType="Button">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Opacity" Value="0.85" />
</Trigger>
</Style.Triggers>
</Style>
Avalonia XAML:
<Style xmlns="https://github.com/avaloniaui" Selector="Button.primary">
<Setter Property="Opacity" Value="1" />
</Style>
<Style xmlns="https://github.com/avaloniaui" Selector="Button.primary:pointerover">
<Setter Property="Opacity" Value="0.85" />
</Style>
<TextBox xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:MyApp.ViewModels"
x:DataType="vm:StateViewModel"
Classes.error="{CompiledBinding HasError}" />
<Style xmlns="https://github.com/avaloniaui" Selector="TextBox.error">
<Setter Property="BorderBrush" Value="#D13438" />
</Style>
using Avalonia.Controls;
var input = new TextBox();
input.Classes.Set("error", viewModel.HasError);
For animated state changes, add Transitions on the control and switch class/pseudo-class state.
DataTrigger/MultiTrigger parity.