WPF多个同族字体文件

WPF multiple Font files of the same family

我有以下字体文件。

MyFont-Regular.tff

MyFont-Bold.tff

MyFont-Italic.tff

如何使用它们?

我可以做到以下几点,

<TextBlock 
FontFamily="/Fonts/MyFont/MyFont-Regular.ttf#My Font"
Text="This is my font"/>

如果我不想使用斜体和粗体等样式怎么办?我不能声明 My Font 由多个文件组成,每个文件都包含字体样式吗?

你不能。但是,您可以将自定义字体包装成 style/resource:

<App.Resources>
    <FontFamily x:Key="CustomRegular">/Fonts/MyFont/MyFont-Regular.ttf#My Font</FontFamily>
    <FontFamily x:Key="CustomBold">/Fonts/MyFont/MyFont-Bold.ttf#My Font</FontFamily>
    <FontFamily x:Key="CustomItalic">/Fonts/MyFont/MyFont-Italic.ttf#My Font</FontFamily>
</App.Resources>

然后像这样使用它:

<TextBlock FontFamily="{StaticResource CustomItalic}">Hello world</TextBlock>

需要部分文字斜体吗?

<TextBlock FontFamily="{StaticResource CustomRegular}">
    <Run FontFamily="{StaticResource CustomItalic}">Hello</Run>
    <Run>World</Run>
</TextBlock>

祝你好运。

这是一个更好的方法:

  1. /Fonts 文件夹添加到您的解决方案。
  2. 将 True Type 字体 (*.ttf) 文件添加到该顺序
  3. 将文件包含到项目中
  4. Select字体并将其添加到解决方案
  5. 设置BuildAction: ResourceCopy To Output Directory: Do not copy。您的 .csproj 文件现在应该有这样一个部分:

     <ItemGroup>
      <Resource Include="Fonts\NotoSans-Bold.ttf" />
      <Resource Include="Fonts\NotoSans-BoldItalic.ttf" />
      <Resource Include="Fonts\NotoSans-Italic.ttf" />
      <Resource Include="Fonts\NotoSans-Regular.ttf" />
      <Resource Include="Fonts\NotoSansSymbols-Regular.ttf" />
    </ItemGroup>
    
  6. App.xaml 中添加 <FontFamily> 资源。它应该类似于以下代码示例。请注意,与应用程序打包时,URI 不包含文件名。

    <Applicaton ...>
    <Application.Resources>
        <FontFamily x:Key="NotoSans">pack://application:,,,/Fonts/#NotoSans</FontFamily>
        <FontFamily x:Key="NotoSansSymbols">pack://application:,,,/Fonts/#NotoSansSymbols</FontFamily>
    </Application.Resources>
    </Application>
    
  7. 像这样应用您的字体:

    <TextBlock x:Name="myTextBlock" Text="foobar" FontFamily="{StaticResource NotoSans}" 
               FontSize="10.0" FontStyle="Normal" FontWeight="Regular" />
    
  8. 也可以强制设置字体:

    var uri = new Uri("pack://application:,,,/");
    myTextBlock.FontFamily = new FontFamily(uri, "./Fonts/#NotoSans");
    

参考资料

这实际上可能的!与其指定 FontFamily="/Fonts/MyFont/MyFont-Regular.ttf#My Font",不如仅指定包含字体文件的文件夹和字体名称:

FontFamily="/Fonts/MyFont/#My Font"

WPF 然后检查该目录中的所有字体文件,如果 字体名称 # 之后指定的名称匹配,则将它们加载到一个 FontFamily 中。

这样您就可以轻松地在资源中定义一个 FontFamily 并通过指定属性 FontWeightFontStyle:

使用其样式
<FontFamily x:Key="MyFont">/Fonts/MyFont/#My Font</FontFamily>

<!-- somewhere else: -->
<TextBlock
    Text="Hello World"
    FontFamily="{StaticResource MyFont}"
    FontWeight="Bold"/>

这将自动使用该文件夹中的 TTF 文件。