So I've been playing around with the RichTextBox
for WPF and decided that it would be a great idea to add font selection to the code. Obviously, this being WPF, I didn't want to just list the fonts out, I wanted to list the fonts out in exactly the way they'd be displayed. In other words, I want the font name to be written out using the font itself. By now it shouldn't come as a surprise to you that this is extremely easy to do in WPF.
First of all, it's really easy to get a list of the fonts. .NET provides a handy little class cunningly enough known as InstalledFontCollection
, so we'll wrap that up in a handy list ready for use:
using System;
using System.Collections.Generic;
using System.Drawing.Text;
using System.Drawing;
namespace FontManager
{
public class InstalledFonts : List<FontFamily>
{
public InstalledFonts()
{
InstalledFontCollection fonts = new InstalledFontCollection();
this.AddRange(fonts.Families);
}
}
}
This class just wraps up the installed font families into a handy dataprovider format. This is all about being nice and blend-friendly.
Next we want to define a usercontrol
to display the fonts. Something to note about this control; we display the data in a virtualizing stack panel - if you don't, you could end up waiting quite a while for the first display of the font.
<UserControl
x:Class="FontManager.InstalledFontDisplay"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:drawing="clr-namespace:System.Drawing;assembly=System.Drawing"
xmlns:m="clr-namespace:FontManager"
xmlns:sys="clr-namespace:System.Collections.Generic;assembly=mscorlib"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<UserControl.Resources>
<Style x:Key="FontStyle">
<Setter Property="Control.FontFamily" Value="{Binding Name}" />
<Setter Property="Control.FontSize" Value="16" />
</Style>
<DataTemplate x:Key="FontTemplate">
<StackPanel VirtualizingStackPanel.IsVirtualizing="True">
<TextBlock
Text="{Binding Name}"
ToolTip="{Binding Name}"
Style="{StaticResource FontStyle}" />
</StackPanel>
</DataTemplate>
<ObjectDataProvider x:Key="FontProvider" ObjectType="{x:Type m:InstalledFonts}"/>
</UserControl.Resources>
<ComboBox
VerticalAlignment="Top"
ItemsSource="{Binding Source={StaticResource FontProvider}}"
ItemTemplate="{StaticResource FontTemplate}" />
</UserControl>
That's it - that's all there is to displaying your font names in the appropriate font. It is so easy, and yet another reason to love WPF. Go on - you know you love it.