【问题标题】:Include Fonts in WPF Application在 WPF 应用程序中包含字体
【发布时间】:2019-11-07 11:57:59
【问题描述】:

好吧,所以我一直在尝试的一切都没有正确加载我的字体,我已将它们添加到 .csproj 文件中,这是通过切换 copy to output directory 完成的,所以这就是它的样子

<Resource Include="Resources\Fonts\SourceSansPro-Black.ttf">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Resource>
    <Resource Include="Resources\Fonts\SourceSansPro-BlackItalic.ttf">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Resource>
    <Resource Include="Resources\Fonts\SourceSansPro-Bold.ttf">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Resource>
    <Resource Include="Resources\Fonts\SourceSansPro-BoldItalic.ttf">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Resource>
    <Resource Include="Resources\Fonts\SourceSansPro-ExtraLight.ttf">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Resource>
    <Resource Include="Resources\Fonts\SourceSansPro-ExtraLightItalic.ttf">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Resource>
    <Resource Include="Resources\Fonts\SourceSansPro-Italic.ttf">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Resource>
    <Resource Include="Resources\Fonts\SourceSansPro-Light.ttf">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Resource>
    <Resource Include="Resources\Fonts\SourceSansPro-LightItalic.ttf">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Resource>
    <Resource Include="Resources\Fonts\SourceSansPro-Regular.ttf">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Resource>
    <Resource Include="Resources\Fonts\SourceSansPro-SemiBold.ttf">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Resource>
    <Resource Include="Resources\Fonts\SourceSansPro-SemiBoldItalic.ttf">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Resource>

然后我在ui-dictionary 中添加了参考,看起来像

    <FontFamily x:Key="Black" >pack://application:,,,/Resources/Fonts/#SourceSansPro-Black</FontFamily>
    <FontFamily x:Key="BlackItalic" >pack://application:,,,/Resources/Fonts/#SourceSansPro-BlackItalic</FontFamily>
    <FontFamily x:Key="Bold" >pack://application:,,,/Resources/Fonts/#SourceSansPro-Bold</FontFamily>
    <FontFamily x:Key="BoldItalic" >pack://application:,,,/Resources/Fonts/#SourceSansPro-BoldItalic</FontFamily>
    <FontFamily x:Key="ExtraLight" >pack://application:,,,/Resources/Fonts/#SourceSansPro-ExtraLight</FontFamily>
    <FontFamily x:Key="ExtraLightItalic" >pack://application:,,,/Resources/Fonts/#SourceSansPro-ExtraLightItalic</FontFamily>
    <FontFamily x:Key="Italic" >pack://application:,,,/Resources/Fonts/#SourceSansPro-Italic</FontFamily>
    <FontFamily x:Key="Light" >pack://application:,,,/Resources/Fonts/SourceSansPro-Light.ttf</FontFamily>
    <FontFamily x:Key="LightItalic" >pack://application:,,,/Resources/Fonts/#SourceSansPro-LightItalic</FontFamily>
    <FontFamily x:Key="Regular" >pack://application:,,,/Resources/Fonts/#SourceSansPro-Regular</FontFamily>
    <FontFamily x:Key="SemiBold" >pack://application:,,,/Resources/Fonts/#SourceSansPro-SemiBold</FontFamily>
    <FontFamily x:Key="SemiBoldItalic" >pack://application:,,,/Resources/Fonts/#SourceSansPro-SemiBoldItalic</FontFamily>

但每次我尝试使用它时,字体都不会加载。所以我在uri中尝试了不同的方法

<!-- First Method -->
    <FontFamily x:Key="Light" >pack://application:,,,/Resources/Fonts/SourceSansPro-Light.ttf#SourceSansPro-Light</FontFamily>

<!-- Second Method -->
<FontFamily x:Key="Light" >pack://application:,,,/Resources/Fonts/#SourceSansPro-Light</FontFamily>

<!-- Third Method -->
<FontFamily x:Key="Light" >/Resources/Fonts/#SourceSansPro-Light</FontFamily>

<!-- Third Method -->
<FontFamily x:Key="Light" >/Resources/Fonts/#SourceSansPro-Light</FontFamily>

<!-- Fourth Method -->
<FontFamily x:Key="Light" >/Resources/Fonts/SourceSansPro-Light.ttf#SourceSansPro-Light</FontFamily>

我错过了什么吗?

【问题讨论】:

  • 您是否尝试过设置字体属性 -> Build Action = Resource ?
  • 是的,它们都设置为资源
  • 看看this SO question
  • @AlessandroD'Andria 我试过了,得到一个异常错误Unable to cast object of type 'System.Windows.Style' to type 'System.Windows.Media.FontFamily
  • 你能检查一下这个链接吗 -> WPF fonts meaby 缺少一些步骤,并且字体“#SourceSansPro-Black”的仅供参考的名称是您在外部程序中打开字体时的名称(名称来自标题栏)不是文件名,请检查一下

标签: c# wpf font-family


【解决方案1】:

在 WPF 中嵌入字体作为资源非常简单。但是,您需要注意一些问题。

这是我在示例应用程序中遵循的分步过程:

在我的项目中添加了Resources/Fonts 文件夹

将 Source Sans Pro .ttf 文件拖到 Fonts 文件夹中

Visual Studio 自动将其Build Action 设置为Resource

注意:如果它们被用作资源,则不需要将它们复制到输出目录

使用以下代码创建了Fonts.xaml ResourceDictionary

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <FontFamily x:Key="Regular">pack://application:,,,/WpfApp4;component/Resources/Fonts/#Source Sans Pro</FontFamily>
    <FontFamily x:Key="Black">pack://application:,,,/WpfApp4;component/Resources/Fonts/#Source Sans Pro Black</FontFamily>

</ResourceDictionary>

然后我将Fonts.xaml 资源合并到我的App.xaml 文件中。

<Application x:Class="WpfApp4.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Fonts.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

您遇到的第一个问题是 Pack Uri 格式不正确。

pack://application:,,,/YourAppNamespace;component/Resources/Fonts/#Font Family Name

您遇到的第二个问题是字体系列名称不正确

字体系列名称通常与 .ttf 文件名相同!

要获得正确的姓氏,我强烈建议使用dp4 Font Viewer

我希望这会有所帮助!

【讨论】:

  • 嘿,谢谢你的回答,我从来没有用过;component 那到底是什么?在 URI 格式方面。这只是说它是一个组件吗?
  • ;component 在处理外部资源程序集时很有帮助。但是,我发现一直使用它可以解决我遇到的很多资源解析问题。
  • @Keithernet 你从来没有展示过你最终的、有效的实现,甚至没有展示过如何去做。您展示了如何实现资源字典,但没有提供有关如何使用它的 XAML 或代码隐藏。您能否编辑您的答案以详细说明这一点?在你的答案末尾显示一个有效的实现将是这个蛋糕需要的糖衣。
  • @DeeJayh 下面是如何使用字体的示例:&lt;TextBlock FontFamily="{StaticResource Regular}" Text="Hello World" /&gt;
猜你喜欢
  • 1970-01-01
  • 2011-09-21
  • 2016-10-07
  • 2012-10-11
  • 2010-10-08
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
相关资源
最近更新 更多