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を持って作成されるようになります。そして特に明示しない限りその中に配置されるコントロールのフォントも「メイリオ」になるわけです。

 


コメント