Почему FontStretch не работает в WPF?

Я пытаюсь установить FontStretch свойство TextBlock в WPF, но кажется, что оно не работает. Я пробовал расширяться, конденсироваться и т. д. но внешний вид текста не изменяется.

Я работаю над Windows XP с Framework 4.0 и протестирован как с Verdana, так и с Arial.

это работает только на Windows 7 или только с некоторыми конкретными шрифтами?

редактировать: если он не работает со всеми шрифтами, есть ли список шрифтов, которые поддержка этой функции? Или можно изменить шрифт, такой как Verdana/Arial, чтобы поддержать его?

5 ответов


чтобы получить аналогичный эффект FontStretch в шрифте, который его не поддерживает, Вы можете использовать LayoutTransform на 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}" />

Это также может быть установлено в стиле, Если вы хотите, чтобы весь текст в TextBlocks казался конденсированным:

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

В отличие от свойств шрифта, таких как полужирный или курсив, WPF не имитирует свойства шрифта, такие как растянуть или маленькие шапки. Используемый шрифт должен поддерживать это сам.

чтобы увидеть, какие шрифты поддерживают FontStretch, вам нужно искать шрифты, которые имеют отдельный файл шрифта, например, конденсированный или расширенный. И тогда будут работать только правильно связанные шрифты TrueType/OpenType. Некоторые поставщики шрифтов неправильно связывают растянутые или сжатые варианты своих шрифтов с обычной версией, поэтому WPF понятия не имеет, что эти варианты шрифта связаны.


путем измерения некоторого текста (TextBlock.Мера), Я нахожу, что Arial Narrow составляет × 0.82 ширины Arial.

Так textBlock.LayoutTransform = new System.Windows.Media.ScaleTransform(0.82, 1.0); при применении к Arial может приблизиться к Arial Narrow.


Я считаю, что FontStretch не работает для всех шрифтов.


Он работает только для шрифтов OpenType. Дополнительная информация:

http://en.wikipedia.org/wiki/OpenType

http://www.adobe.com/type/opentype/

http://www.microsoft.com/typography/WhatIsOpenType.mspx