74786


システムのフォントサイズは SystemFonts.MessageFontSize
で取得できるのですが、この値が変化したというイベントはどのようにしたら取得できるでしょうか。

XAMLから直接参照するならば DynamicResource で実現可能ですが、今回はコード内での利用を考えています。

### 目的

システムのフォントサイズを元に、各種フォントサイズやアイコンサイズ、レイアウトを計算して追従させる

### 環境

  * .NET framework 4.8


CC BY-SA 4.0
2021-03-17T05:03:50.500
74714
2021-03-20T12:51:23.597
14817
question
.net wpf
システムのフォントサイズの変化を監視したい


Windows
Formsの事例ですが、[SystemEvents.UserPreferenceChanged](https://docs.microsoft.com/en-
us/dotnet/api/microsoft.win32.systemevents.userpreferencechanged?view=netframework-4.8)イベントを使ってシステムフォントの変更を監視する方法が紹介されています。

  * [Respond to Font Scheme Changes in a Windows Forms app | Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/desktop/winforms/how-to-respond-to-font-scheme-changes-in-a-windows-forms-application?view=netframeworkdesktop-4.8)

注意点として、このイベントはスタティックイベントなので、追加したイベントハンドラーはアプリケーションの破棄時に削除するようにしておかないとメモリリークします。

[System.Drawing.SystemFonts](https://docs.microsoft.com/en-
us/dotnet/api/system.drawing.systemfonts?view=netframework-4.8)クラスおよび[System.Drawing.Font](https://docs.microsoft.com/en-
us/dotnet/api/system.drawing.font?view=netframework-4.8)クラスはGDI+の.NETラッパーですが、フォントサイズなどの情報を取得するだけであればWPFからでも（System.Drawing.dll
のアセンブリ参照を追加するだけで）使用できるはずです。

しかし、イベントを受けてコードビハインドで変更を反映するのではなく、XAMLで[System.Windows.SystemFonts](https://docs.microsoft.com/en-
us/dotnet/api/system.windows.systemfonts?view=netframework-4.8)を参照することを強く推奨します。

  * [How to: Use SystemFonts - WPF .NET Framework | Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/desktop/wpf/advanced/how-to-use-systemfonts?view=netframeworkdesktop-4.8)

システムフォントサイズをそのまま使うのではなく、一定の倍率を乗じた値を利用したいなどの場合は、バインディングの際にコンバーターを挟めばよいだけです。

  * [データ バインディングの概要 - WPF .NET Framework | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/desktop/wpf/data/data-binding-overview?view=netframeworkdesktop-4.8#data-conversion)

また、画面レイアウトはフォントサイズに依存しないように相対的に設計するべきです。


CC BY-SA 4.0
2021-03-20T12:51:23.597
74786
2021-03-20T12:51:23.597
15413
74714
answer