AgentStack
SKILL verified MIT Self-run

Avalonia Wpf Migration

skill-linuxdevel-avalonia-skills-avalonia-wpf-migration · by linuxdevel

Use when migrating a WPF application to Avalonia, mapping WPF concepts to Avalonia equivalents, or understanding differences between WPF and Avalonia APIs.

No reviews yet
0 installs
10 views
0.0% view→install

Install

$ agentstack add skill-linuxdevel-avalonia-skills-avalonia-wpf-migration

✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.

Security review

✓ Passed

No 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.

Are you the author of Avalonia Wpf Migration? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

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

  • INotifyPropertyChanged implementations
  • ICommand implementations
  • ObservableCollection usage
  • IValueConverter implementations
  • 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 FrameworkElement as base class — use Control
  • Style TargetType without x:Key for 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.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet — be the first.

Versions

  • v0.1.0 Imported from the upstream source.