2.6 フォント
2.6.1 フォントのサイズ
Control クラスでは、コントロールが表示するコンテンツに使われるテキストのフォントを指定するプロパティが用意されています。Control クラスが提供するフォントを指定する各種プロパティは、コントロールの利用者が、コントロールに対して望ましいと考えられる情報を設定するもので、この情報がどのように利用されるかは、コントロール側の問題です。
例えば、フォントのサイズは FontSize プロパティから設定することができます。既定では、システム ダイアログのフォントサイズが設定されています。
[TypeConverterAttribute(typeof(FontSizeConverter))] [BindableAttribute(true)] [LocalizabilityAttribute(LocalizationCategory.None)] public double FontSize { get; set; }
この値を変更することで、例えばコンテンツとして表示されるテキストのサイズを変更することができます。ボタンに表示されるテキスト、ラベルが表示するテキスなど、多くのコントロールは、コンテンツとして何らかのテキストを表示します。FontSize プロパティを変更することで、こうしたテキストを変更することができます。
using System; using System.Windows; class Test { [STAThread] public static void Main() { Window wnd = new Window(); wnd.Content = "カ、カン違いしないでよねっ!"; wnd.FontSize = 30; Application app = new Application(); app.Run(wnd); } }
コード1は、表示するウィンドウの Content プロパティにコンテンツとなるテキストを設定すると同時に、FontSize プロパティの値を変更しています。実行結果を見ると、既定のサイズよりも、大きく文字が表示されています。
2.6.2 フォントスタイル
フォントの太さや斜体の指定なども Control クラスのプロパティから指定することができます。
フォントの太さは FontWeight プロパティから設定することができます。
[BindableAttribute(true)] public FontWeight FontWeight { get; set; }
FontWeight プロパティに設定できるのは System.Windows.FontWeight 構造体の値です。
[TypeConverterAttribute(typeof(FontWeightConverter))] [bilityAttribute(LocalizationCategory.None)] public struct FontWeight : IFormattable
通常、FontWeight 構造体の値を独自に用意する必要はありません。FontWeight プロパティに設定するべき有効な値の FontWeight 型の値は System.Windows.FontWeights クラスが提供しています。このクラスは Brushed クラスと同様に、静的プロパティから有効な FontWeight 型の値を提供することが役割です。FontWeights クラス自体をインスタンス化することはありません。
public static class FontWeights
既定では Normal プロパティが返す FontWeight オブジェクトが設定されています。
public static FontWeight Normal { get; }
例えば、フォントを太字に設定したい場合は Bold プロパティを設定します。
public static FontWeight Bold { get; }
実際には太字かどうかではなく、フォントの重量として、1 ~ 999 までの値で管理しています。FontWeight 構造体は内部でこの値を保持し、既定の太さである Normal は 400、Bold は 700 という値を表しています。しかし、この値にしたがって詳細に太さを変更することができるフォントは限られているので、通常は Normal と Bold 以外を使うことはないでしょう。
using System; using System.Windows; class Test { [STAThread] public static void Main() { Window wnd = new Window(); wnd.Content = "べ、別にあんたの為じゃないんだから!"; wnd.FontSize = 30; wnd.FontWeight = FontWeights.Bold; Application app = new Application(); app.Run(wnd); } }
コード2は、表示するウィンドウの FontWeight プロパティに Bold を設定しています。規定の設定と比較すると、表示されるテキストが太字になっていることが確認できます。
同様に、テキストを斜体にするには FontStyle プロパティを利用します。
BindableAttribute(true)] public FontStyle FontStyle { get; set; }
FontStyle プロパティには、System.Windows.FontStyle 構造体の値を設定することができます。
[LocalizabilityAttribute(LocalizationCategory.None)] [TypeConverterAttribute(typeof(FontStyleConverter))] public struct FontStyle : IFormattable
FontStyle 構造体もまた、列挙的な性質を持つ構造体で、直接 FontStyle 構造体の値を作成する必要はありません。有効な FontStyle 構造体の値は System.Windows.FontStyles クラスが提供してくれます。
public static class FontStyles
FontStyles クラスは、静的なプロパティから有効な FontStyle 構造体の値を提供しています。既定のフォントは Normal プロパティが返す値が設定されていますが、フォントを斜体で表示させたい場合は Italic プロパティが返す値を設定します。
public static FontStyle Normal { get; }
public static FontStyle Italic { get; }
FontStyles クラスは、斜体をシミュレーションで生成することを表す Oblique プロパティも提供しています。
public static FontStyle Oblique { get; }
Oblique が設定されている場合、斜体フォントではなく、通常のフォントから斜体フォントを生成します。そのため、斜体がサポートされていないフォントなどでも、フォントを斜体にすることができます。
using System; using System.Windows; class Test { [STAThread] public static void Main() { Window wnd = new Window(); wnd.Content = "Don't misunderstand me!"; wnd.FontSize = 30; wnd.FontStyle = FontStyles.Italic; Application app = new Application(); app.Run(wnd); } }
コード3は、ウィンドウの FontStyle プロパティに Italic を設定してテキストを表示しています。結果を見ると、テキストがわずかに傾いていることが確認できます。
2.6.3 フォントファミリ
フォントは、Microsoft .NET Framework 上ではなく、Windows システムにインストールされています。そのため、利用可能なフォントの種類はアプリケーションを実行している環境によって異なるという点に注意しなければなりません。
フォントの種類は、フォントファミリと呼ばれる情報で決定されます。フォントファミリとは、フォントの名前と種類を表す純粋な文字列の一種です。コントロールに表示するフォントの種類は FontFamily プロパティから設定または取得することができます。既定では、システムのフォントが設定されています。
[LocalizabilityAttribute(LocalizationCategory.Font)] [BindableAttribute(true)] public FontFamily FontFamily { get; set; }
FontFamily プロパティには、フォントファミリを表す System.Windows.Media.FontFamily クラスのオブジェクトを設定します。FontFamily オブジェクトは、システムにインストールされているフォントに対応しています。
[LocalizabilityAttribute(LocalizationCategory.Font)] [TypeConverterAttribute(typeof(FontFamilyConverter))] public class FontFamily
FontFamily オブジェクトを取得する方法はいくつかありますが、最も基本的な方法は FontFamily クラスのコンストラクタに対して、直接フォントファミリを表す文字列を設定することです。
public FontFamily (string familyName)
<<FontFamily クラスのコンストラクタ>>
familyName には、フォントファミリをあらわす文字列、つまりフォント名を指定します。フォント名はシステムにインストールされているフォントに対応する正しい名前でなければなりません。フォントの正式名称は、システムのフォント選択ダイアログなどで確認することができます。例えば、メモ帳の「書式」メニューの「フォント」を選択して、表示されたダイアログの「フォント名」リストにあるフォント名などです。
FontFamily オブジェクトが表すフォントは Source プロパティから取得することができます。
public string Source { get; }
<<FontFamily クラス Source プロパティ>>
Source プロパティが返す文字列は、FontFamily コンストラクタに設定した文字列に対応しています。FontFamily オブジェクトが表しているフォントの種類を文字列で取得したい場合に利用してください。
using System; using System.Windows; using System.Windows.Media; class Test { [STAThread] public static void Main() { Window wnd = new Window(); wnd.Content = "あんですと~"; wnd.FontSize = 30; wnd.FontFamily = new FontFamily("HG行書体"); Application app = new Application(); app.Run(wnd); } }
コード4は、"HG行書体" を新しいフォントとして設定し、文字列を表示しています。FontFamily コンストラクタに指定する文字列は、実行するシステムにインストールされている適切なフォントファミリを指定子なければなりません。実行する環境によってはフォントがインストールされていないので、直接、文字列リテラルを設定するような方法は本来ならば推奨されません。
システムにインストールされているフォントを確実に利用するには System.Windows.Media.Fonts クラスから情報を取得します。
public static class Fonts
Fonts クラスは、システムにインストールされているフォントの情報を静的なプロパティで提供しています。有効な FontFamily オブジェクトの配列を Fonts クラスから取得することで、アプリケーションを実行している環境でインストールされているフォントを調べることができます。
システムにインストールされているフォントの配列は SystemFontFamilies プロパティから取得することができます。
public static ICollection<FontFamily> SystemFontFamilies { get; }
SystemFontFamilies は、FontFamily の配列である ICollection オブジェクトを返します。このオブジェクトには、有効な FontFamily オブジェクトが各要素に保存されているので、ここから利用したいフォントを選択することで、確実に有効なフォントを利用することができます。
using System; using System.Collections.Generic; using System.Windows; using System.Windows.Media; class Test { [STAThread] public static void Main() { string fontNames = ""; int i = 1; foreach(FontFamily fm in Fonts.SystemFontFamilies) { fontNames += fm.Source + ", "; if (i % 5 == 0) fontNames += "\n"; i++; } Window wnd = new Window(); wnd.Content = fontNames; wnd.FontSize = 20; Application app = new Application(); app.Run(wnd); } }
コード5は、システムにインストールされている有効なフォントを列挙するプログラムです。Fonts.SystemFontFamilies から FontFamily のコレクションを取得し、各 FontFamily オブジェクトの Source プロパティが返す文字列を結合したものをウィンドウにコンテンツとして表示させています。