【问题标题】:WPF multiple Font files of the same familyWPF 同一系列的多个字体文件
【发布时间】:2017-12-19 01:20:20
【问题描述】:

我有以下字体文件。

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 由几个文件组成,每个文件都包含字体样式吗?

【问题讨论】:

    标签: wpf fonts winrt-xaml


    【解决方案1】:

    你不能。但是,您可以将自定义字体包装到样式/资源中:

    <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>
    

    祝你好运。

    【讨论】:

    • 对我来说,关键部分是大多数示例都省略了 TTF 文件名,如果您的不同字体文件不共享相同的内部名称,这很好。
    【解决方案2】:

    这是一个更好的方法:

    1. /Fonts 文件夹添加到您的解决方案中。
    2. 将 True Type 字体 (*.ttf) 文件添加到该订单中
    3. 将文件包含到项目中
    4. 选择字体并将它们添加到解决方案中
    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 添加&lt;FontFamily&gt; 资源。它应该类似于以下代码示例。请注意,在打包应用程序时,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");
      

    参考文献

    【讨论】:

      【解决方案3】:

      这实际上可能的!与其指定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 文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-10
        • 2015-07-08
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        • 1970-01-01
        • 2014-11-20
        • 1970-01-01
        相关资源
        最近更新 更多