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 サーフェス |
Grid、 StackPanel、 Canvas |
変更なし |
同じ名前 |
TextBox、 Button、 CheckBox |
変更なし |
同じ名前、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 相互運用パターンを使用する
関連するコンテンツ