執筆者: 大野 元久

動作確認環境: Visual Studio 2008、Visual Studio 2010

更新日: 2011 年 1 月 7 日

WPF で使えるコモン ダイアログは、ファイルの選択に関連するものだけです。Windows フォームで使えるコモン ダイアログのうち、フォント ダイアログを使う方法について解説します。

Code [C#]

private void button_Click(object sender, RoutedEventArgs e)
{
   var dlg = new System.Windows.Forms.FontDialog();

   if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
   {
       text1.FontFamily = new FontFamily(dlg.Font.FontFamily.Name);
       text1.FontSize = dlg.Font.SizeInPoints / 72.0 * 96.0;
       text1.FontStyle = (dlg.Font.Style & System.Drawing.FontStyle.Italic) == 0
           ? FontStyles.Normal : FontStyles.Italic;
       text1.FontWeight = (dlg.Font.Style & System.Drawing.FontStyle.Bold) == 0
           ? FontWeights.Normal : FontWeights.Bold;
   }
}

Code [XAML]

<Window x:Class="WpfApplication1.MainWindow"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       Title="MainWindow" Height="350" Width="525">
   <Grid>
       <Grid.RowDefinitions>
           <RowDefinition Height="Auto" />
           <RowDefinition Height="*" />
       </Grid.RowDefinitions>
       <Button Content="_Font" HorizontalAlignment="Left" Click="button_Click" />
       <!-- TextOptions は WPF 4 のみ -->
       <TextBox x:Name="text1" Grid.Row="1" IsReadOnly="True" TextWrapping="Wrap"
                TextOptions.TextFormattingMode="Display"
                TextOptions.TextRenderingMode="ClearType"
                TextOptions.TextHintingMode="Auto">
           The quick brown fox jumps over the lazy dog.
           すばしっこい茶色の狐は、のろまな犬を飛び越える。
       </TextBox>
   </Grid>
</Window>

実行結果


ポイント

Windows フォームのために用意されている FontDialog は、アセンブリへの参照を追加すれば、WPF アプリケーションでも利用できます。ソリューション エクスプローラーでプロジェクト名を右クリックして、[参照の追加] を選び、「参照の追加」 ダイアログで、「System.Drawing」と「System.Windows.Forms」を追加します (下図参照)。これで、System.Windows.Forms 名前空間にある FontDialog クラスを利用できます。

Windows フォームと WPF では、フォントの扱い方が異なるため、選択したフォントをそのまま使うことはできません。上記では、FontDialog オブジェクトの Font プロパティを元に、TextBox の FontFamily、FontSize、FontStyle、FontWeight プロパティに設定する値を求めています。特に FontDialog ではフォントの大きさ (Font.SizeInPoints) がポイント数 (単位は 1/72 インチ) で返されるのに対し、WPF の FontSize プロパティはデバイス非依存のピクセル数 (単位は 1/96 インチ) で表されることに注意してください。

WPF では、デフォルトでアンチエイリアシング (ピクセルのギザギザを目立たせない処理) が行われるため、フォントがぼけて見えることがあります。WPF 4 では、TextOptions という添付プロパティが用意されており、Windows フォームで使われる GDI 互換やアンチエイリアシングを使わない描画ができます。添付プロパティに設定できる値を以下の表に示します。

TextOptions 添付プロパティ 設定値
TextFormattingMode Ideal (適切なフォント メトリックを使う)
Display (GDI 互換のフォント メトリックを使う)
TextRenderingMode Auto (最適な描画アルゴリズムを選択する)
Aliased (アンチエイリアシングを使わない)
Grayscale (グレースケールで描画する)
ClearType (ClearType アルゴリズムで描画する)
TextHintingMode Auto (最適な描画手法を選択する)
Fixed (静的テキストに適した手法で描画する)
Animated (アニメーション テキストに適した手法で描画する)

上記の例では、GDI 互換のフォント メトリックと ClearType を使っています。以下に、いくつかの組み合わせの例を示します。

  • TextFormattingMode=Ideal、TextRenderingMode=ClearType
  • TextFormattingMode=Display、TextRenderingMode=Grayscale
  • TextFormattingMode=Display、TextRenderingMode=Aliased

なお、ここでは TextBox のフォントのみを変更していますが、this などを使ってウィンドウ全体のフォントを変更することもできます。この場合は、レイアウト全体への影響を考慮する必要があります。Windows フォームの場合は、通常、フォントのサイズに合わせてスケール (サイズ調整) されますが、WPF では指定されたサイズが維持されます。たとえば、コントロールの大きさや Grid の高さや幅を固定値ではなく Auto として指定しておくと、フォントを変更したときに自動的にコントロールの大きさも調整されます。WPF では、フォントの変更はウィンドウの大きさが変更されるのと同じような影響があると考えればよいでしょう。ウィンドウの大きさの変更に柔軟に対応できるようにしておけば、フォントの変更にも対応しやすくなります。

Windows フォーム用の FontDialog を使わず、独自のフォント変更用ダイアログを作成することもできます。WPF テキスト チームのブログで、詳細なフォント選択ウィンドウの作成例 (英語) が紹介されています。このプログラムを実行すると次のようになります。


Code Recipe Code Recipe

ページのトップへ