19
votes

I am trying setting FontStretch property on a TextBlock in WPF but it seems that it does not work. I tried Expanded, Condensed, etc. but the text appearance does not change.

I am working on Windows XP with Framework 4.0 and tested both with Verdana and Arial.

Does it work only on Windows 7 or only with some specific fonts?

EDIT: If it does not work with all fonts, is there a list of fonts that support this feature? Or is it possible to modify a font like Verdana/Arial to support it?

5

5 Answers

27
votes

To get a similar effect to FontStretch in a font that doesn't support it, you can use a LayoutTransform on the TextBlock:

<Application.Resources>
  <ScaleTransform x:Key="FontStretchCondensed" ScaleX="0.8" />
  <ScaleTransform x:Key="FontStretchExpanded" ScaleX="1.2" />
</Application.Resources>

...

<TextBlock Text="This is my text"
           LayoutTransform="{StaticResource FontStretchCondensed}" />

This can also be set in a style if you want to have all text in TextBlocks appear condensed:

<Style TargetType="TextBlock">
  <Style.Setters>
    <Setter Property="LayoutTransform" Value="{StaticResource FontStretchCondensed}" />
  </Style.Setters>
</Style>
6
votes

Unlike font properties such as bold or italic, WPF does not simulate font properties such as stretch or small caps. The font used must support this itself.

To see which fonts support FontStretch, you'll need to look for fonts that have a separate font file for e.g. Condensed or Expanded. And then only properly linked TrueType/OpenType fonts will work. Some font vendors do not properly link stretched or condensed variants of their fonts to the regular version, so WPF has no idea that these font variants are related.

4
votes

By measuring some text (TextBlock.Measure), I find that Arial Narrow is × 0.82 the width of Arial.

So textBlock.LayoutTransform = new System.Windows.Media.ScaleTransform(0.82, 1.0); when applied to Arial might approximate Arial Narrow.

2
votes

I believe FontStretch doesn't work for all fonts.