🍥

WPF vs WinUI 3 機能対比表

2023/04/24に公開
2

はじめに

今まで 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.2
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
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 × 機能無し 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

凡例

  • 対応
記号 意味
Window App SDK(Template Studio for WinUI)が対応している。
Window App SDK(Template Studio for WinUI)が対応しているが機能不足。
あるいは、Windows Community Toolkit 等の Microsoft 提供パッケージで代替対応可能。
× 機能無し。
サードパーティーのパッケージや Windows API の使用が必要。

WPF の機能に対応しているかの観点であり、WPF には無い WinUI 3 の新機能は考慮の対象外です。

  • Ver:当初確認時の Windows App SDK のバージョン。上位バージョンは、対応が同様であれば更新しません。対応が異なる場合は追記します。

参考リンク

Discussion

フシハラフシハラ

外見がモダンなのはいいけど、
ウィンドウの位置・サイズをプログラムから直接弄れないとか
ダイアログやコンテキストメニューが元ウィンドウの領域の外に出る事が出来ないとか
(アプリが原則フルスクリーンで動く事前提の)スマホUIの事しか考えずに設計したのがあからさまでげんなりする…。
スマホとデスクトップPCのUIを同一化するなんて不可能だといい加減認めてくれ。

SHINTASHINTA

ウィンドウの位置関係は非常に弱いですよね。
今後大幅にバージョンアップされることを期待したいところですが……。