Primary WPF APIs:
Style, BasedOnControlTemplate, DataTemplateTemplateBindingPrimary Avalonia APIs:
Style with selectorsControlThemeControlTemplate, DataTemplateTemplateBinding| WPF | Avalonia |
|---|---|
Style TargetType="Button" |
Style Selector="Button" |
BasedOn style chains |
style layering/ordering + theme composition |
ControlTemplate |
ControlTemplate |
DataTemplate |
DataTemplate |
TemplateBinding |
TemplateBinding |
WPF XAML:
<Style TargetType="Button">
<Setter Property="Padding" Value="12,6" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}" CornerRadius="6">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Avalonia XAML:
<Style xmlns="https://github.com/avaloniaui" Selector="Button.rounded">
<Setter Property="Padding" Value="12,6" />
<Setter Property="Template">
<ControlTemplate>
<Border Background="{TemplateBinding Background}" CornerRadius="6">
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}" />
</Border>
</ControlTemplate>
</Setter>
</Style>
Data template sample:
<ListBox xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:MyApp.ViewModels"
x:DataType="vm:UsersPageViewModel"
ItemsSource="{CompiledBinding Users}">
<ListBox.ItemTemplate>
<DataTemplate x:DataType="vm:UserViewModel">
<TextBlock Text="{CompiledBinding Name}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
using Avalonia.Controls;
using Avalonia.Controls.Templates;
var list = new ListBox
{
ItemsSource = viewModel.Users,
ItemTemplate = new FuncDataTemplate<UserViewModel>((item, _) => new TextBlock { Text = item.Name })
};