WPF多个同一系列的Font文件

时间:2016-01-20 15:00:53

标签: wpf fonts winrt-xaml

我有以下字体文件。

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包含多个文件,每个文件都包含字体样式?

3 个答案:

答案 0 :(得分:4)

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

<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 :(得分:3)

这是一种更好的方法:

  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添加<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");
    
  9. 参考

答案 2 :(得分:2)

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

FontFamily="/Fonts/MyFont/#My Font"
然后,如果字体名称FontFamily之后指定的名称匹配,WPF会检查该目录中的所有字体文件并将其加载到一个#

通过这种方式,您可以在资源中轻松定义一个FontFamily,并通过指定属性FontWeightFontStyle来使用其样式:

<FontFamily x:Key="MyFont">/Fonts/MyFont/#My Font</FontFamily>

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

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