rksoftware

Visual Studio とか C# とかが好きです

.NET 5 の WinForms で 表示が崩れる場合

.NET 5 の WinForms でプロジェクトを新規作成し設定を変えずに Form にコントロールを置いて実行すると高 DPI 環境で表示が崩れます。

■ 表示例

.NET Core 3.1 の場合

f:id:rksoftware:20201005014636j:plain

.NET 5 の場合

f:id:rksoftware:20201005014650j:plain

■ 対応方法

app.manifest ファイルを作成します。
ソリューションエクスプローラーで右クリック 追加 > 新しい項目 > 全般 > アプリケーション マニフェスト ファイル でファイルを作成します。デフォルトでは app.manifest となりました(作成時に変更可)。 ファイルの中の dpiAware のセクションがコメントになっています。

<!-- アプリケーションが DPI 対応であり、それ以上の DPI で Windows によて自動的にスケーリングされないことを
     示します。Windows Presentation Foundation (WPF) アプリケーションは自動的に DPI に対応し、オプトインする必要は
     ありません。さらに、この設定にオプトインする .NET Framework 4.6 を対象とする Windows Forms アプリケーションは、
     app.config ファイルで 'EnableWindowsFormsHighDpiAutoResizing' 設定を 'true' に設定する必要があります。-->
<!--
<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
  </windowsSettings>
</application>
-->

このコメントを外します。

<!-- アプリケーションが DPI 対応であり、それ以上の DPI で Windows によて自動的にスケーリングされないことを
     示します。Windows Presentation Foundation (WPF) アプリケーションは自動的に DPI に対応し、オプトインする必要は
     ありません。さらに、この設定にオプトインする .NET Framework 4.6 を対象とする Windows Forms アプリケーションは、
     app.config ファイルで 'EnableWindowsFormsHighDpiAutoResizing' 設定を 'true' に設定する必要があります。-->
<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
  </windowsSettings>
</application>

これでビルドをして実行すると、期待通りに動作しました。

f:id:rksoftware:20201005014636j:plain

簡単ですね。