WPF アプリを WinUI 3 に移行する

WPFアプリは.NETで実行されますが、Windows Presentation Foundation XAML スタックを使用します。 WinUI 3 は最新の代替品です。 AI 移行の主な課題は、WPFは System.Windows.* 名前空間を使用し、WinUI 3 では Microsoft.UI.Xaml.* を使用し、多くのコントロールとウィンドウ化 API には単純な検索と置換ではなく、対象を絞った置換が必要です。

WPF移行スキルをインストールする

gh copilot plugin install winui@awesome-copilot

API 置換テーブル

名前空間

WPF WinUI 3
System.Windows.* Microsoft.UI.Xaml.*
System.Windows.Controls.* Microsoft.UI.Xaml.Controls.*
System.Windows.Media.* Microsoft.UI.Xaml.Media.*
System.Windows.Data.* Microsoft.UI.Xaml.Data.*
System.Windows.Input.* Microsoft.UI.Input.*

コントロール

WPF WinUI 3 メモ
Window Microsoft.UI.Xaml.Window 異なる API サーフェス
GridStackPanelCanvas 変更なし 同じ名前
TextBoxButtonCheckBox 変更なし 同じ名前、WinUI スタイル
ListBox / ListView ListView 新しいコードに ItemsView を使用する
DataGrid DataGrid (CommunityToolkit) CommunityToolkit.WinUI.Controls.DataGridを追加する
TabControl TabView 異なる API
Menu / MenuItem MenuBar / MenuBarItem
ToolBar CommandBar
RichTextBox RichEditBox
WebBrowser WebView2 異なる API、非同期

スレッド化

WPF WinUI 3
Dispatcher.Invoke(...) DispatcherQueue.TryEnqueue(...)
Dispatcher.BeginInvoke(...) DispatcherQueue.TryEnqueue(DispatcherQueuePriority.Low, ...)
Application.Current.Dispatcher this.DispatcherQueue

ウィンドウ処理と DPI

WPF WinUI 3
Window.WindowState AppWindow.Presenter (OverlappedPresenter を使用)
SystemParameters.WorkArea DisplayArea.GetFromWindowId(...)
PresentationSource.FromVisual() WinRT.Interop.WindowNative.GetWindowHandle(window)

データ バインディング

WPF WinUI 3
INotifyPropertyChanged 変更なし
ObservableCollection<T> 変更なし
{Binding} {x:Bind} 推奨(コンパイル時)
DependencyProperty 変更なし
IValueConverter 変更なし

リソースとスタイル

WPF WinUI 3
ResourceDictionary 変更なし
StaticResource 変更なし
DynamicResource システム カラーの場合は {ThemeResource}
SystemColors.WindowBrush {ThemeResource SystemFillColorSolidNeutralBrush}

スタート プロンプト

I'm migrating a WPF app to WinUI 3 using the Windows App SDK.

Apply these substitutions:
- System.Windows.* → Microsoft.UI.Xaml.*
- Dispatcher.Invoke / BeginInvoke → DispatcherQueue.TryEnqueue
- Window.WindowState → AppWindow with OverlappedPresenter
- PresentationSource → WinRT.Interop.WindowNative.GetWindowHandle
- DynamicResource for system colors → ThemeResource
- {Binding} → {x:Bind} where possible (compile-time binding)
- ListBox → ListView or ItemsView
- TabControl → TabView
- WebBrowser → WebView2
- DataGrid → CommunityToolkit.WinUI.Controls.DataGrid

Do not use any System.Windows.* namespaces in new code.
Do not use Dispatcher.Invoke — use DispatcherQueue.TryEnqueue.
Flag APIs without a direct WinUI 3 equivalent rather than guessing.

Project ファイルの変更

<!-- Before (WPF) -->
<TargetFramework>net10.0-windows</TargetFramework>
<UseWPF>true</UseWPF>

<!-- After (WinUI 3) -->
<TargetFramework>net10.0-windows10.0.19041.0</TargetFramework>
<WindowsSdkPackageVersion>10.0.19041.31</WindowsSdkPackageVersion>
dotnet add package Microsoft.WindowsAppSDK

直接移行しない API

推測ではなく、これらのフラグを設定するようにエージェントに指示します。

  • WPF Adorner レイヤー — WinUI 3 に相当するものはありません
  • WPF FlowDocument / DocumentViewer — 編集可能なコンテンツには RichEditBox を使用します。同等のビューアーはありません
  • WPF Viewport3D — Win2D または DirectX 相互運用機能を使用する
  • エアスペース/HWND ホスティング - SwapChainPanel または Win32 相互運用パターンを使用する