🍥
WPF vs WinUI 3 機能対比表
はじめに
今まで WPF を使っていて、新たに WinUI 3(Windows App SDK)に移行しようと思ったときに、「WPF のこれは WinUI 3 ではどうやるんだ?」と機能の違いに迷ったところを一覧にしました。
前提として Template Studio for WinUI を使用しているので、素の WinUI 3 より少し強くなった状態での機能比較です。

それでも WinUI 3 の機能が少なすぎて、日本で WinUI 3 を使っているのは数人しかいないのではという気がしてくるレベルですが……。
もし同志の方がいらっしゃいましたら、「ここはこっちのほうが簡単」「自分はこの対比で迷った」などコメントで教えていただけましたら幸いです。
Window
WPF の Window は ContentControl から派生していますが、WinUI 3 の Window は Object から直接派生しています。このため単に機能が少ないというだけではなく、添付プロパティーが作れず MVVM と相性が悪いです。なぜこのような設計なのか、ご存じのかたがいらっしゃいましたら教えていただけましたら幸いです。
| WPF | 対応 | Windows App SDK | Ver |
|---|---|---|---|
| Window.GetWindow() | × | 機能無し | 1.2 |
| Window.Height ※FrameworkElement.Height |
△ |
WindowEx.Height ※メインウィンドウでは反映されない。 |
1.2 |
| Window.Left | △ | WindowEx.AppWindow.Move() ※XAML 不可。 |
1.2 |
| Window.MaxHeight ※FrameworkElement.MaxHeight |
○ | WindowEx.MaxHeight | 1.2 |
| Window.MaxWidth ※FrameworkElement.MaxWidth |
○ | WindowEx.MaxWidth | 1.2 |
| Window.MinHeight ※FrameworkElement.MinHeight |
○ | WindowEx.MinHeight | 1.2 |
| Window.MinWidth ※FrameworkElement.MinWidth |
○ | WindowEx.MinWidth | 1.2 |
| Window.ResizeMode | △ | WindowEx.AppWindow.SetPresenter() OverlappedPresenter.Create() で作成した OverlappedPresenter のプロパティーを設定して渡す。 ※XAML 不可。 |
1.2 |
| Window.ShowInTaskbar | ○ | WindowEx.IsShownInSwithers | 1.2 |
| Window.SizeToContent | × | 機能無し | 1.2 |
| Window.Title | ○ | WindowEx.Title ※Window.Title は XAML 不可だが WindowEx.Title は XAML 可能。 |
1.2 |
| Window.Top | △ | WindowEx.AppWindow.Move() ※XAML 不可。 |
1.2 |
| Window.Topmost | ○ | WindowEx.IsAlwaysOnTop | 1.2 |
| Window.Width ※FrameworkElement.Width |
△ | WindowEx.Width ※メインウィンドウでは反映されない。 |
1.2 |
| モーダル表示 | × | 機能無し | 1.2 |
各種 UI
| WPF | 対応 | Windows App SDK | Ver |
|---|---|---|---|
| ContentControl.ContentStringFormat | × | 機能無し | 1.3 |
| ContextMenu | ○ |
Flyout ※1.3 以下ではウィンドウ外にはみ出せなかったが 1.4 で改善。 |
1.4 |
| DataGrid | × | 機能無し ※昔は Windows Community Toolkit の DataGrid があったが現在は無い |
1.7 |
| DataGridComboBoxColumn.SelectedValuePath | × | Windows Community Toolkit の DataGridComboBoxColumn に機能無し | 1.2 |
| DockPanel | ○ |
RelativePanel Windows Community Toolkit の DockPanel |
1.2 |
| FrameworkElement.Cursor | △ |
UIElement.ProtectedCursor ※protected |
1.2 |
| Label | ○ | TextBlock | 1.2 |
| Menu | ○ |
MenuBar ※1.3 以下ではウィンドウ外にはみ出せなかったが 1.4 で改善。 |
1.4 |
| MenuItem | ○ | 最上位メニューとしての MenuItem → MenuBarItem サブメニューコンテナとしての MenuItem → MenuFlyoutSubItem アイテムとしての MenuItem → MenuFlyoutItem |
1.3 |
| MenuItem.InputGestureText | ○ | UIElement.KeyboardAccelerators | 1.3 |
| MessageBox | △ |
ContentDialog ※ウィンドウ外にはみ出ることは不可。 MessageDialog ※Fluent デザインではない。 |
1.4 |
| MessageBox Ctrl+C コピー | × | 機能無し | 1.2 |
| OpenFileDialog | △ |
FileOpenPicker ※デフォルトフィルターを設定できないなど機能は少ない。 |
1.8 |
| OpenFolderDialog | △ |
FolderPicker ※デフォルトフィルターを設定できないなど機能は少ない。 |
1.8 |
| SaveFileDialog | △ |
FileSavePicker ※デフォルトフィルターを設定できないなど機能は少ない。 |
1.8 |
| Separator | ○ | Menu 内の Separator → MenuFlyoutSeparator | 1.3 |
| ToolTipService.ShowDuration | × | 機能無し | 1.2 |
| UIElement.CaptureMouse() | △ | UIElement.CapturePointer() ※ポインターが押された状態でのみキャプチャ可能。 |
1.2 |
| UIElement.IsEnabled | × | 機能無し ※Control.IsEnabled はあるが、例えば StackPanel 内の UI を一括で無効にすることができない。 |
1.2 |
| UIElement.IsVisible | × | 機能無し ※Visibility はある。 |
1.2 |
| UIElement.OnRender() | △ |
Win2D の CanvasControl.Draw ※メモリリークに注意。 |
1.2 |
| Visibility.Hidden | × | 機能無し | 1.3 |
| WrapPanel | △ | Windows Community Toolkit の WrapPanel | 1.3 |
XAML 関連
| WPF | 対応 | Windows App SDK | Ver |
|---|---|---|---|
| Binding.Delay | × | 機能無し | 1.3 |
| Byte 型の TwoWay バインディング | × | 機能無し ※IValueConverter を作成して対応。 ※OneWay は可能。 |
1.2 |
| enum のバインディング | × | 機能無し ※IValueConverter を作成して対応。 |
1.3 |
| RelativeSourceMode.FindAncestor | × | 機能無し | 1.2 |
| エディタプレビュー | × | 機能無し ※デバッグ実行のホットリロードで代替。 |
1.2 |
| バインディング | ○ | {Binding}(動的バインド)に加えて {x:Bind}(静的バインド)も使用可能。 {x:Bind} はデフォルトで Mode=OneTime なことに注意。 |
1.2 |
その他
| WPF | 対応 | Windows App SDK | Ver |
|---|---|---|---|
| Clipboard ※System.Windows 名前空間。 |
△ |
Clipboard ※Windows.ApplicationModel.DataTransfer 名前空間。 DataPackage / DataPackageView を介してコピー&ペースト。 ペースト時は同期メソッド無し。 |
1.2 |
| HwndSource | × | 機能無し ※Windows API で代替。 |
1.2 |
| msixbundle パッケージ作成 | ○ | ※Template Studio 使用時は msix が作成される。 | 1.5 |
凡例
- 対応
| 記号 | 意味 |
|---|---|
| ○ | WinUI 3(Template Studio for WinUI)、Window App SDK(WinRT 含む)が対応している。 |
| △ | WinUI 3(Template Studio for WinUI)が対応しているが機能不足。 あるいは、Windows Community Toolkit 等の Microsoft 提供パッケージで代替対応可能。 |
| × | 機能無し。 サードパーティーのパッケージや Windows API の使用が必要。 |
WPF の機能に対応しているかの観点であり、WPF には無い WinUI 3 の新機能は考慮の対象外です。
- Ver:当初確認時の Windows App SDK のバージョン。上位バージョンは、対応が同様であれば更新しません。対応が異なる場合は追記します。
Discussion
外見がモダンなのはいいけど、
ウィンドウの位置・サイズをプログラムから直接弄れないとか
ダイアログやコンテキストメニューが元ウィンドウの領域の外に出る事が出来ないとか
(アプリが原則フルスクリーンで動く事前提の)スマホUIの事しか考えずに設計したのがあからさまでげんなりする…。
スマホとデスクトップPCのUIを同一化するなんて不可能だといい加減認めてくれ。
ウィンドウの位置関係は非常に弱いですよね。
今後大幅にバージョンアップされることを期待したいところですが……。