C#のWPFでアプリのデフォルトのフォントを変える

WPFでは各コントロールがFontFamilyプロパティを持っており、このプロパティを指定する事でコントロール毎に思い通りのフォントへ変更する事が出来ます。

 

このプロパティは特に指定しなければ親コントロールの設定が引き継がれます。

一番親となるWindowクラスでも指定しなければシステムフォントが使われます。

 

 

いくつものWindowが登場するアプリケーションを作ろうとした場合、その1つ1つにFontFamilyプロパティを設定していくのは少し面倒です。設定は1回で済ませたい

 

そんな時にはWindowクラスの依存関係プロパティオーバーライドするという方法があります。

Windowクラスの依存関係プロパティをオーバーライド

プロジェクトを作成すると、Applicationクラスから派生した Appクラス(App.xml.cs)が作成されます。

作ろうとしているアプリケーションの基幹となるクラスです。

 

この AppクラスのコンストラクタでWindowオブジェクトが作られる時のスタイルを設定します。

App.xml.cs

    public partial class App : Application
    {
        public App()
        {
            var font = new System.Windows.Media.FontFamily("メイリオ");

            var style = new Style(typeof(Window));
            style.Setters.Add(new Setter(Window.FontFamilyProperty, font));

            FrameworkElement.StyleProperty.OverrideMetadata(typeof(Window), new FrameworkPropertyMetadata(style));
        }
    }

FontFamilyオブジェクトの作成 (5行目)

システムで利用したいフォント名を指定してFontFamilyオブジェクトを作成

(上の例では「メイリオ」フォントを指定)

 

 

Styleオブジェクトを作成 (7行目~8行目)

WindowクラスをTargetTypeとしたStyleオブジェクトを作成

作成したFontFamilyオブジェクトをFontFamilyPropertyへセットする

 

 

WindowクラスのStyleプロパティをオーバーライド (10行目)

作成したStyleオブジェクトでFrameworkPropertyMetadataオブジェクトを作成

FrameworkElement.StyleProperty.OverrideMetadataメソッドでWindowクラスのStyleプロパティをオーバーライドする

 

 

 

以降、このアプリケーションで作成されるWindowオブジェクトは「メイリオ」のFontFamiltyを持って作成されるようになります。そして特に明示しない限りその中に配置されるコントロールのフォントも「メイリオ」になるわけです。