.net 为什么FontStretch在WPF中不起作用?

.net 为什么FontStretch在WPF中不起作用?,.net,wpf,fonts,stretch,.net,Wpf,Fonts,Stretch,我试图在WPF中的文本块上设置FontStretch属性,但似乎不起作用。我尝试了扩展、压缩等,但文本外观没有改变 我正在使用框架4.0操作Windows XP,并使用Verdana和Arial进行了测试 它是仅在Windows7上工作还是仅在某些特定字体上工作 编辑:如果不适用于所有字体,是否有支持此功能的字体列表?或者可以修改Verdana/Arial这样的字体来支持它吗?我认为FontStretch不适用于所有字体。它只适用于OpenType字体。有关更多信息: 与粗体或斜体等字体属性

我试图在WPF中的文本块上设置FontStretch属性,但似乎不起作用。我尝试了扩展、压缩等,但文本外观没有改变

我正在使用框架4.0操作Windows XP,并使用Verdana和Arial进行了测试

它是仅在Windows7上工作还是仅在某些特定字体上工作


编辑:如果不适用于所有字体,是否有支持此功能的字体列表?或者可以修改Verdana/Arial这样的字体来支持它吗?

我认为FontStretch不适用于所有字体。

它只适用于OpenType字体。有关更多信息:


与粗体或斜体等字体属性不同,WPF不模拟拉伸或小大写等字体属性。使用的字体本身必须支持此功能


要查看哪些字体支持FontStretch,您需要查找具有单独字体文件的字体,例如压缩或扩展字体。然后只有正确链接的TrueType/OpenType字体才能工作。一些字体供应商没有将其字体的拉伸或压缩变体正确链接到常规版本,因此WPF不知道这些字体变体是否相关。

若要在不支持字体拉伸的字体中获得与FontStretch类似的效果,可以在TextBlock上使用LayoutTransform:

<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}" />

...
如果希望文本块中的所有文本都显示为压缩文本,也可以在样式中设置:

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

通过测量一些文本(TextBlock.Measure),我发现Arial的窄值是Arial宽度的×0.82


因此
textBlock.LayoutTransform=new System.Windows.Media.ScaleTransform(0.82,1.0)应用于Arial时可能近似于Arial窄字体。

请注意,并非所有OpenType字体都支持此功能。例如Calibri不支持。UWP不支持LayoutTransform,我测试了上述代码,但VS报告了错误。如何解决这个问题?这不也会扩展你的字体,让它看起来“胖”吗?我相信这是一个更好的答案: