如何在不安装WPF应用程序的情况下包含外部字体

She*_*bin 44 c# wpf fonts

如何在不安装WPF应用程序的情况下包含外部字体

我试过这段代码

  System.Drawing.Text.PrivateFontCollection privateFonts = new    System.Drawing.Text.PrivateFontCollection();
  privateFonts.AddFontFile("C:\\Documents and Settings\\somefont.ttf");
  System.Drawing.Font font = new Font(privateFonts.Families[0], 12);
  this.label1.Font = font;
Run Code Online (Sandbox Code Playgroud)

它在Windows窗体应用程序中正常工作,但在WPF中没有.

Mov*_*GP0 95

这有两种方法.一种方法是将字体打包在应用程序中.另一种方法是将字体分别输出到输出文件夹.差异主要是加载文件所需的URI.

包装与应用程序

  1. /Fonts在解决方案中添加一个文件夹.
  2. 将True Type Fonts(*.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>
    
    Run Code Online (Sandbox Code Playgroud)
  6. App.xaml添加<FontFamily>资源.它应该类似于以下代码示例.请注意,在使用应用程序打包时,URI不包含文件名.

    <Applicaton ...>
    <Application.Resources>
        <FontFamily x:Key="NotoSans">pack://application:,,,/Fonts/#Noto Sans</FontFamily>
        <FontFamily x:Key="NotoSansSymbols">pack://application:,,,/Fonts/#Noto Sans Symbols</FontFamily>
    </Application.Resources>
    </Application>
    
    Run Code Online (Sandbox Code Playgroud)
  7. 像这样应用你的字体:

    <TextBlock x:Name="myTextBlock" Text="foobar" FontFamily="{StaticResource NotoSans}" 
               FontSize="10.0" FontStyle="Normal" FontWeight="Regular" />
    
    Run Code Online (Sandbox Code Playgroud)
  8. 您还可以强制设置字体:

    myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/"), "./Fonts/#Noto Sans");
    
    Run Code Online (Sandbox Code Playgroud)

复制到输出目录

  1. /Fonts在解决方案中添加一个文件夹.
  2. 将True Type Fonts(*.ttf)文件添加到该订单
  3. 将文件包含在项目中
  4. 选择字体并将其添加到解决方案中
  5. 设置BuildAction: ContentCopy To Output Directory: Copy if newer.你的.csproj文件现在应该有这样一个部分:

     <ItemGroup>
      <Content Include="Fonts\NotoSans-Bold.ttf">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
      <Content Include="Fonts\NotoSans-BoldItalic.ttf">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
      <Content Include="Fonts\NotoSans-Italic.ttf">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
      <Content Include="Fonts\NotoSans-Regular.ttf">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
      <Content Include="Fonts\NotoSansSymbols-Regular.ttf">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
    </ItemGroup>
    
    Run Code Online (Sandbox Code Playgroud)
  6. App.xaml添加<FontFamily>资源.它应该类似于以下代码示例.请注意,在使用应用程序打包时,URI不包含文件名.

    <Applicaton ...>
    <Application.Resources>
        <FontFamily x:Key="NotoSansRegular">./Fonts/NotoSans-Regular.tts#Noto Sans</FontFamily>
        <FontFamily x:Key="NotoSansItalic">./Fonts/NotoSans-Italic.tts#Noto Sans</FontFamily>
        <FontFamily x:Key="NotoSansBold">./Fonts/NotoSans-Bold.tts#Noto Sans</FontFamily>
        <FontFamily x:Key="NotoSansBoldItalic">./Fonts/NotoSans-BoldItalic.tts#Noto Sans</FontFamily>
        <FontFamily x:Key="NotoSansSymbols">./Fonts/NotoSans-Regular.tts#Noto Sans Symbols</FontFamily>
    </Application.Resources>
    </Application>
    
    Run Code Online (Sandbox Code Playgroud)
  7. 像这样应用你的字体:

    <TextBlock Text="foobar" FontFamily="{StaticResource NotoSansRegular}" 
               FontSize="10.0" FontStyle="Normal" FontWeight="Regular" />
    
    Run Code Online (Sandbox Code Playgroud)

参考

  • 仅供参考,神秘的“#NotoSans”标识符不是由文件名驱动的。您需要在 Windows 中双击该文件,以打开字体的预览窗口。将有一个标签,上面写着“字体名称:NotoSans”,这是您在 WPF 中引用时要使用的字体名称。 (10认同)
  • 请说明`#names` 的来源以及它们是如何构建的。只是没有以`#` 开头的扩展名的文件名?否则:很好,详细的答案! (8认同)
  • @JackMiller,我知道已经有一段时间了,但我有同样的问题。您可以通过执行以下操作获得 `#names`: 在 Windows 资源管理器中右键单击字体。转到属性 -&gt; 详细信息 -&gt; 标题。 (3认同)
  • 散列后面的字符串是字体的名称。不幸的是,除了在预览中打开字体文件或安装它并在文本编辑器中使用字体选择之外,我真的不知道如何获取它们。可能有更好的方法来做到这一点...... (2认同)

小智 24

我使用这样的XAML代码:

<Style x:Key="Hatten">
        <Setter Property="TextElement.FontFamily" Value="Resources/#HATTEN" />
</Style>
Run Code Online (Sandbox Code Playgroud)

#HATTEN - 参考资源中的hatten.tft.

使用风格:

 <TextBlock x:Name="lblTitle" Style="{DynamicResource Hatten}" FontSize="72"></TextBlock>
Run Code Online (Sandbox Code Playgroud)

  • 代码片段"<Style>"不完整/误导.更好地遵循MovGP0的答案.它基本相同但更详细.OTF也有效. (4认同)

Dev*_*per 18

我在这里找到的这个问题的最佳答案

http://geekswithblogs.net/Martinez/archive/2010/01/29/custom-font-in-wpf-application.aspx

解决方案 它涉及使用比以前更邪恶的字符串,但按预期工作:

<Label FontFamily="pack://application:,,,/Folder1/#Katana">Text</Label> 
Run Code Online (Sandbox Code Playgroud)

哪里Folder1是你保持一个TTF文件的项目的文件夹中.最后三个笔记:

  1. 'Katana'是字体的名称,而不是文件的名称.这是显着的差异.要获取字体的名称,只需单击该文件两次.

  2. 请记住在字体名称前加上井号"#".否则它将不起作用.

  3. 自定义字体也可以添加到项目中,并将"构建操作"设置为"内容".然而,这不是推荐的方法,为了简单起见,我忽略了这种可能性.

一些额外的链接

https://msdn.microsoft.com/en-us/library/ms753303(v=vs.100).aspx

https://msdn.microsoft.com/en-us/library/cc296385.aspx


Wag*_*ior 6

我没有找到任何答案.但我找到了一个我没有在互联网上看到的解决方案.

我遵循建议做一个文件夹并将所有文件标记为资源.但我需要枚举它们,这是我的主要问题,因为我需要将所有内容加载到我的屏幕而不在某处记录名称.我只想简单地将另一种字体拖放到该文件夹​​并列出它.

我发现这是一个列出resources/fonts文件夹中所有文件的解决方案

Fonts.GetFontFamilies(new Uri("pack://application:,,,/resources/fonts/#"))
Run Code Online (Sandbox Code Playgroud)

我希望它能帮助你整理字体.

  • 请添加指向此API参考页面的链接. (2认同)

Stu*_*ioX 6

包含外部字体的最简单方法是

步骤 1.创建文件夹Fonts并将您的字体添加到其中。

在此处输入图片说明

步骤 2.将构建操作设置为content并将复制到输出目录设置为Copy always

在此处输入图片说明

步骤 3.构建解决方案以使用 Font 目录更新它。

步骤 4.在元素中使用字体FontFamily="Fonts/#font name"

在此处输入图片说明

全部完成!

感谢cscience