---
lang: ja-jp
breaks: true
---
# C# WinForm `AutoScaleDimensions` 指定の有無で `.NET Framework` と `.NET Core` で解像度 100% 時の スケーリング結果が異なる 2021-09-30
## 環境
* Windows10/11
* .NET Framework 4.7.2/4.8
* .NET Core 5.0/6.0
## `ContainerControl.AutoScaleDimensions` プロパティ
> https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.containercontrol.autoscaledimensions
> コントロールがデザインされたときの 1 インチあたりのドット数 (DPI) または SizeF サイズを格納する Font。
>
> プロパティは、 AutoScaleDimensions コントロールが拡大または縮小された画面の DPI またはフォントの設定を表します。 具体的には、デザイン時に、このプロパティは、モニターが現在使用している値に Windows フォームデザイナーによって設定されます。 次に、実行時にフォームが読み込まれるときに、 CurrentAutoScaleDimensions プロパティがと異なる場合、 AutoScaleDimensions メソッドが PerformAutoScale 呼び出され、コントロールとそのすべての子のスケーリングが実行されます。 その後、 AutoScaleDimensions は新しいスケーリングサイズを反映するように更新されます。
> Windows フォームでの自動スケーリング
> https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.containercontrol.autoscaledimensions
## `.NET Framework` と `.NET Core` で `AutoScaleDimensions` 生成内容が異なる

※いずれも解像度100%の時の動作。
※プロジェクトテンプレートでは生成されないが、デザイナーを開いて保存すると出力される。
### `.NET Framework 4.8`
```csharp=
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
```
### `.NET Core 3.1` ~ `.NET Core 6.0`
```csharp=
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
```
### `csproj`の`TargetFrameworks`に`net6.0-windows;net48`と指定した場合。
```csharp=
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
```
### `csproj`の`TargetFrameworks`に`net48;net6.0-windows`と指定した場合。
```csharp=
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
```
:::info
**重要**
`net48` と `net6.0-windows` の書き順を逆にすると動作が変わる。
:::
### `csproj`の`TargetFrameworks`に`net48`とだけ指定した場合。
```csharp=
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
```
:::info
> Windows フォーム手書き時の注意 AutoScaleDimensions 設定
> https://rksoftware.hatenablog.com/entry/2019/01/02/212625
> Size of Form and controls is bigger in WinForms .NET Core app compared to WinForms .NET Framework app #1948
> https://github.com/dotnet/winforms/issues/1948
> Warn about AutoScaleBaseSize issues with WinForms #547
> https://github.com/dotnet/upgrade-assistant/issues/547
:::
## `AutoScaleDimensions = SizeF(7F, 15F)` の場合の動作
### `.NET Core`

### `.NET Framework`

## `AutoScaleDimensions = SizeF(6F, 12F)` の場合の動作
### `.NET Core`

### `.NET Framework`

## `AutoScaleDimensions = SizeF(0F, 0F)` の場合の動作
### `.NET Core`

### `.NET Framework`

## `.NET Core 3.0` 以降では、デフォルトフォントが変更されており、そのことが原因との記載あり
> Default control font changed to Segoe UI 9 pt
> https://docs.microsoft.com/en-us/dotnet/core/compatibility/fx-core#default-control-font-changed-to-segoe-ui-9-pt
> Breaking change in SuspendLayout + AutoScaleDimensions interplay vs .NET Framework #2986
> https://github.com/dotnet/winforms/issues/2986
### `.NET Core` のデフォルトフォント

### `.NET Framework` のデフォルトフォント

### プログラムのエントリポイントに以下の設定を入れることで、`.NET Framework`時代と同じ動作となる。
```csharp=
#if NETCOREAPP3_0_OR_GREATER
// .NET Framework時代のデフォルトに合わせる。
Application.SetDefaultFont(new System.Drawing.Font(new System.Drawing.FontFamily("MS UI Gothic"), 9f));
#endif
```
### `.NET Core` に於ける WinForm デザイナが `AutoScaleDimensions` を算出するときに使用されるデフォルトフォントを変更する方法が見つからないので、Formを継承した業務Formの親クラスでフォントを明示的に指定する方法で対応する。
## 2021-11-18追記 Visual Studio 2022 から??以下の方法で設定可能なようだ
> Visual Studio 2022 for .NET WinForms developers
> https://youtu.be/irfQczdVjRA
> {%youtube irfQczdVjRA %}
> https://youtu.be/irfQczdVjRA?t=655
> 
```xml=
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
・・・
<ApplicationDefaultFont>MS UI Gothic, 9pt</ApplicationDefaultFont>
・・・
</PropertyGroup>
```
:::warning
`ApplicationDefaultFont`の設定をプロジェクトファイルに追加しても、実行時には適用されない模様。`Application.SetDefaultFont`の記載も必要。
:::
###### tags: `WinForm` `C#` `DPI` `AutoScaleDimensions` `.NET Framework` `.NET Core`