質問: システムのフォントサイズは SystemFonts.MessageFontSize で取得できるのですが、この値が変化したというイベントはどのようにしたら取得できるでしょうか。 XAMLから直接参照するならば DynamicResource で実現可能ですが、今回はコード内での利用を考えています。 ### 目的 システムのフォントサイズを元に、各種フォントサイズやアイコンサイズ、レイアウトを計算して追従させる ### 環境 * .NET framework 4.8
回答: Windows Formsの事例ですが、SystemEvents.UserPreferenceChangedイベントを使ってシステムフォントの変更を監視する方法が紹介されています。 * Respond to Font Scheme Changes in a Windows Forms app | Microsoft Docs 注意点として、このイベントはスタティックイベントなので、追加したイベントハンドラーはアプリケーションの破棄時に削除するようにしておかないとメモリリークします。 System.Drawing.SystemFontsクラスおよびSystem.Drawing.FontクラスはGDI+の.NETラッパーですが、フォントサイズなどの情報を取得するだけであればWPFからでも(System.Drawing.dll のアセンブリ参照を追加するだけで)使用できるはずです。 しかし、イベントを受けてコードビハインドで変更を反映するのではなく、XAMLでSystem.Windows.SystemFontsを参照することを強く推奨します。 * How to: Use SystemFonts - WPF .NET Framework | Microsoft Docs システムフォントサイズをそのまま使うのではなく、一定の倍率を乗じた値を利用したいなどの場合は、バインディングの際にコンバーターを挟めばよいだけです。 * データ バインディングの概要 - WPF .NET Framework | Microsoft Docs また、画面レイアウトはフォントサイズに依存しないように相対的に設計するべきです。