Assist migration from WPF to WinUI 3 / Windows App SDK with code transformation and compatibility guidance
Assists migration from WPF to WinUI 3 by analyzing code and providing transformation guidance.
npx claudepluginhub a5c-ai/babysitterThis skill is limited to using the following tools:
README.mdAssist migration from WPF to WinUI 3 / Windows App SDK. This skill analyzes WPF applications and provides migration paths, code transformations, and compatibility guidance for modernizing to WinUI 3.
{
"type": "object",
"properties": {
"projectPath": {
"type": "string",
"description": "Path to the WPF project"
},
"migrationStrategy": {
"enum": ["full", "incremental", "analysis-only"],
"default": "analysis-only"
},
"targetSdk": {
"type": "string",
"default": "1.5",
"description": "Target Windows App SDK version"
},
"preserveWpfComponents": {
"type": "array",
"items": { "type": "string" },
"description": "WPF components to keep via XAML Islands"
},
"generateReport": {
"type": "boolean",
"default": true
}
},
"required": ["projectPath"]
}
{
"type": "object",
"properties": {
"success": { "type": "boolean" },
"compatibility": {
"type": "object",
"properties": {
"score": { "type": "number" },
"blockers": { "type": "array" },
"warnings": { "type": "array" }
}
},
"migrationTasks": {
"type": "array",
"items": {
"type": "object",
"properties": {
"category": { "type": "string" },
"task": { "type": "string" },
"effort": { "enum": ["low", "medium", "high"] },
"automated": { "type": "boolean" }
}
}
},
"codeTransformations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"file": { "type": "string" },
"original": { "type": "string" },
"transformed": { "type": "string" }
}
}
}
},
"required": ["success"]
}
| WPF | WinUI 3 |
|---|---|
System.Windows | Microsoft.UI.Xaml |
System.Windows.Controls | Microsoft.UI.Xaml.Controls |
System.Windows.Media | Microsoft.UI.Xaml.Media |
System.Windows.Input | Microsoft.UI.Xaml.Input |
System.Windows.Data | Microsoft.UI.Xaml.Data |
<!-- WPF -->
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- WinUI 3 -->
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MyApp">
// WPF
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
// WinUI 3
public sealed partial class MainWindow : Window
{
public MainWindow()
{
this.InitializeComponent();
// WinUI 3: No automatic window sizing
this.SetWindowSize(800, 600);
}
private void SetWindowSize(int width, int height)
{
var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
var windowId = Microsoft.UI.Win32Interop.GetWindowIdFromWindow(hWnd);
var appWindow = Microsoft.UI.Windowing.AppWindow.GetFromWindowId(windowId);
appWindow.Resize(new Windows.Graphics.SizeInt32(width, height));
}
}
<!-- WPF: DataGrid -->
<DataGrid ItemsSource="{Binding Items}"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
</DataGrid.Columns>
</DataGrid>
<!-- WinUI 3: Community Toolkit DataGrid -->
<toolkit:DataGrid ItemsSource="{x:Bind ViewModel.Items}"
AutoGenerateColumns="False">
<toolkit:DataGrid.Columns>
<toolkit:DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
</toolkit:DataGrid.Columns>
</toolkit:DataGrid>
<!-- WPF: Classic binding -->
<TextBlock Text="{Binding Name}"/>
<Button Command="{Binding SaveCommand}"/>
<!-- WinUI 3: x:Bind (compiled bindings, recommended) -->
<TextBlock Text="{x:Bind ViewModel.Name, Mode=OneWay}"/>
<Button Command="{x:Bind ViewModel.SaveCommand}"/>
<!-- WinUI 3: Classic binding still works -->
<TextBlock Text="{Binding Name}"/>
<!-- WPF -->
<ResourceDictionary>
<SolidColorBrush x:Key="AccentBrush" Color="#0078D4"/>
<Style TargetType="Button">
<Setter Property="Background" Value="{StaticResource AccentBrush}"/>
</Style>
</ResourceDictionary>
<!-- WinUI 3 -->
<ResourceDictionary>
<SolidColorBrush x:Key="AccentBrush" Color="#0078D4"/>
<Style TargetType="Button">
<Setter Property="Background" Value="{StaticResource AccentBrush}"/>
</Style>
</ResourceDictionary>
<!-- Note: Largely compatible, but some default styles differ -->
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<UseWPF>true</UseWPF>
</PropertyGroup>
</Project>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
<TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
<UseWinUI>true</UseWinUI>
<WindowsPackageType>None</WindowsPackageType>
<Platforms>x64;x86;arm64</Platforms>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.5.240227000"/>
<PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22621.756"/>
</ItemGroup>
</Project>
| Feature | Alternative |
|---|---|
| NavigationWindow | Custom navigation with Frame |
| DataGrid (built-in) | Community Toolkit DataGrid |
| RichTextBox | RichEditBox |
| WebBrowser | WebView2 |
| WindowsFormsHost | Not available (use XAML Islands in reverse) |
| System tray icons | Win32 APIs directly |
| WPF Feature | WinUI 3 Approach |
|---|---|
| Application.Current.Dispatcher | DispatcherQueue |
| RoutedUICommand | ICommand implementation |
| Triggers in styles | VisualStateManager |
| Effect (blur, etc.) | Composition APIs |
| DynamicResource | StaticResource (mostly) |
// WPF
Application.Current.Dispatcher.Invoke(() => {
// UI code
});
// WinUI 3
DispatcherQueue.GetForCurrentThread().TryEnqueue(() => {
// UI code
});
<!-- WPF: Style Trigger -->
<Style TargetType="Button">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="LightBlue"/>
</Trigger>
</Style.Triggers>
</Style>
<!-- WinUI 3: VisualStateManager -->
<Style TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="RootBorder" Background="{TemplateBinding Background}">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="PointerOver">
<Storyboard>
<ColorAnimation Storyboard.TargetName="RootBorder"
Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)"
To="LightBlue"/>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<ContentPresenter/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
wpf-mvvm-scaffold - MVVM pattern (works in both)msix-package-generator - WinUI 3 packagingdesktop-migration process - Full migration workflowwpf-dotnet-expert - WPF expertisedesktop-migration-strategist - Migration planningActivates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use for discovering, retrieving, and improving prompts.
Search, retrieve, and install Agent Skills from the prompts.chat registry using MCP tools. Use when the user asks to find skills, browse skill catalogs, install a skill for Claude, or extend Claude's capabilities with reusable AI agent components.
This skill should be used when the user wants to "create a skill", "add a skill to plugin", "write a new skill", "improve skill description", "organize skill content", or needs guidance on skill structure, progressive disclosure, or skill development best practices for Claude Code plugins.