WinUI3アプリのウインドウを、dpiの大きなモニタに移動すると、中のUI部品は大きくなるのに、ウインドウの大きさはそのままになる

もくじ
https://tera1707.com/entry/2022/02/06/144447#WinUI3

やりたいこと

UWPやWPFのウインドウをdpi=100%のモニターから125%のモニターに移動すると、ウインドウが25%分大きくなり、中の部品も25%分大きくなって、結果いい感じに見えるのだが、WinUI3で作ったアプリで同じことをすると、中のUI部品は大きくなるのに、ウインドウの大きさはそのままになって、つぶれたように見える。

下記が、比較したときのサンプル。
(UWP/WPF/MFCとWinUI3で、ウインドウの中にボタンだけを配置したもの。)

WinUI3だけ、125%のモニターにもっていったときに、中の部品だけ大きくなって、ウインドウの大きさが変わらないので、比率が違って見える。
中の部品がもっと多いと、端にあった部品がはみ出て見えたりする。

この動きを、どうにかしてUWP/WPF/MFCと同じ動きをするようにしたい。

前提

  • VisualStudio2022 Community 17.1.4
  • WinUI3.0
  • Windows App SDK 1.0
  • 2022年5月の時点で調査実施

前置き

これでよいのかどうかははっきり言って自信がないのだが、とりあえず下記のようにすると、UWP/WPF/MFCと同じ動きをさせることはできた。

やったこと

dpiAwaredpiAwarenessの設定を「System Aware」 にする。
参考の表

具体的には、WinUI3のプロジェクトのapp.manifest<dpiAware><dpiAwareness>の値を下記のようにする。

設定名 設定値
dpiAware <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
dpiAwareness <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">system</dpiAwareness>

設定を行うのは、下記のapp.manifest

これを行うと、UWPと同じ動きにできた。
(が、これでいいのか、これだけでいいのか、は現状勉強不足でわからない...)

メモ

WinUI3のプロジェクトに標準で含まれるapp.manifestは、初期状態で下記の値になっている。

  • dpiAware=true
  • dpiAwareness=PerMonitorV2, PerMonitor

試した限り、これらの値がPerMonitorやPerMonitorV2だと、100%→高dpi(125%など)のディスプレイ移動時に、winui3のウインドウが小さくなるっぽい。
(小さくなるというか、125%にあった大きさにならない)

PJ作成時、上記のマニフェストを使うように設定がされているので、掲題の動作になっている様子。

WPFでdpiAwareをPerMonitorにしたらWinUI3と同じ動きになるかも?と思い、試しにWPFでPerMonitorに設定したmanifestを設定してみたが、標準のWinUI3のような動き(ウインドウは大きくならずに中身だけ大きくなる)にはならなかった。

参考

dpiAwareの設定をする

https://docs.microsoft.com/en-us/windows/win32/hidpi/setting-the-default-dpi-awareness-for-a-process

高DPI対応の方法
と書いてはあるが、ちょっと難しい。。。

https://docs.microsoft.com/ja-jp/windows/win32/hidpi/high-dpi-desktop-application-development-on-windows

参考書

WinUI3

WinUI3でアプリを作ろうと思ったときのとっかかりによかった。 msdocsに書いてある情報を、体系的に、順番に読みたいな、というときによいかも。(ただし英語)
この本で分からなかった、かゆいところに手が届かなかった部分を私は記事にしてる感じ。

C#①

表紙に書いてある通り、教科書として最適。 これからC#を勉強したいけど、ネットだけで勉強するのは効率が悪いから体系的に学べる本が欲しいときや、 ちょっとC#を勉強してコード書けるようになったけど、もう少し広く深く知りたいなというときによいと思う。
私は仕事で触れるコードを軸に、基本ネットで断片的にC#を学んだので、その知識の隙間を埋めて枝葉を広げるためにとても分かりやすかった。

C#②

C#の文法的に色々できるのは分かったが、いざ実装するときに、わかったことを使ってどう実装すればいいのか?と悩んだときに指針になりそうな本。
「プロパティ等の名前の付け方、どうすればいい?」「情報をクラス外部に見せるときに、プロパティにすべき?メソッドにすべき?」「異常だと判定したいとき、どんなときにどんな例外をスローすべき?」などなど、勉強になる部分が山ほどあった。
私のように「コードは書くけどこれであってるのか自信がない、レビューで指摘されるのが嫌だ、実装時の(心の)よりどころが欲しい」という人に最適。