Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why FontStretch does not work in WPF?

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?

like image 208
Drake Avatar asked Jun 01 '10 08:06

Drake


4 Answers

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>
like image 99
Ray Burns Avatar answered Nov 18 '22 03:11

Ray Burns


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.

like image 40
Ruben Avatar answered Nov 18 '22 03:11

Ruben


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.

like image 4
Mark Cranness Avatar answered Nov 18 '22 04:11

Mark Cranness


I believe FontStretch doesn't work for all fonts.

like image 2
Stefan Szasz Avatar answered Nov 18 '22 02:11

Stefan Szasz