Install
$ agentstack add skill-linuxdevel-avalonia-skills-avalonia-wpf-migration ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
Avalonia WPF Migration
Overview
Avalonia's API is intentionally WPF-like. Most XAML, binding, and MVVM patterns transfer directly. Key differences: styling system, ControlTemplates → ControlThemes, no Triggers, .axaml extension, namespace differences.
Quick Mapping Table
| WPF | Avalonia | Notes | |---|---|---| | .xaml | .axaml | Extension differs | | xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | xmlns="https://github.com/avaloniaui" | Root namespace | | DependencyProperty | StyledProperty / DirectProperty | See property system | | FrameworkElement | Control | Base for custom controls | | UserControl (base) | UserControl | Same name, similar API | | Control (for lookless) | TemplatedControl | Different base class | | Style with TargetType | ControlTheme with TargetType | Styling lookless controls | | Style with Triggers | Style with nested styles + pseudoclasses | No Triggers in Avalonia | | DataTrigger | Binding + pseudoclass / Classes binding | Pattern change | | ResourceDictionary Source= | ResourceInclude Source="avares://..." | URI scheme differs | | pack://application:,,,/ | avares://AssemblyName/ | Asset URI scheme | | Window.ShowDialog() | window.ShowDialog(owner) | Requires owner parameter | | MessageBox.Show() | No built-in — use dialog or notification | API removed | | Dispatcher.Invoke() | Dispatcher.UIThread.InvokeAsync() | Async-first | | BindingOperations.ClearBinding() | control.ClearValue(prop) | Slightly different | | x:Static | x:Static | Same | | TemplateBinding | TemplateBinding | Same | | RelativeSource Self | {Binding $self.Property} | Different syntax | | RelativeSource AncestorType | {Binding $parent[TypeName].Property} | Different syntax | | EventTrigger + Storyboard | Animation in styles | Different animation system | | BitmapImage + Uri | Bitmap + AssetLoader | Different image loading | | IValueConverter | IValueConverter | Same interface | | IMultiValueConverter | IMultiValueConverter | Same interface | | ObservableCollection | ObservableCollection | Same | | ICommand | ICommand | Same | | CollectionViewSource | DataGridCollectionView | Different class | | Frame + NavigationService | ContentControl + ViewModel swap | MVVM pattern preferred |
Styles: No Triggers
WPF:
Avalonia:
ControlTemplate → ControlTheme
WPF:
...
Avalonia:
...
RelativeSource Binding
Asset URIs
Dialogs
// WPF
MessageBox.Show("Hello");
var dialog = new OpenFileDialog();
dialog.ShowDialog();
// Avalonia
// Use StorageProvider for file dialogs (see avalonia-services skill)
// Use WindowNotificationManager for notifications
// For message dialogs: use a community library like MessageBox.Avalonia
// or implement a simple dialog Window
var result = await new ConfirmDialog("Are you sure?").ShowDialog(owner);
Dispatcher
// WPF
Dispatcher.Invoke(() => { /* UI update */ });
// Avalonia
await Dispatcher.UIThread.InvokeAsync(() => { /* UI update */ });
// or
Dispatcher.UIThread.Post(() => { /* fire-and-forget */ });
What Works Without Changes
INotifyPropertyChangedimplementationsICommandimplementationsObservableCollectionusageIValueConverterimplementations- Data binding patterns (with namespace/syntax adjustments)
- Most MVVM framework code (ReactiveUI, CommunityToolkit.Mvvm)
ItemsControl,ListBox,DataGrid(similar APIs)- Grid, StackPanel, DockPanel layouts (same attached properties)
Common Mistakes
- Using WPF Trigger syntax — silently ignored or compile error
- Using
pack://URIs — assets not found - Calling
MessageBox.Show()— doesn't exist - Using
FrameworkElementas base class — useControl Style TargetTypewithoutx:Keyfor ControlThemes — template not applied
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: linuxdevel
- Source: linuxdevel/Avalonia-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.