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

时间:2011-06-23 12:00:49

标签: 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;

它在Windows窗体应用程序中正常工作,但在WPF中无法正常工作。

13 个答案:

答案 0 :(得分:81)

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

包含应用程序

  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/#Noto Sans</FontFamily>
        <FontFamily x:Key="NotoSansSymbols">pack://application:,,,/Fonts/#Noto Sans Symbols</FontFamily>
    </Application.Resources>
    </Application>
    
  7. 像这样应用你的字体:

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

    myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/"), "./Fonts/#Noto Sans");
    
  9. 复制到输出目录

    1. 在解决方案中添加/Fonts文件夹。
    2. 将True Type字体(*.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>
      
    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>
      
    7. 像这样应用你的字体:

      <TextBlock Text="foobar" FontFamily="{StaticResource NotoSansRegular}" 
                 FontSize="10.0" FontStyle="Normal" FontWeight="Regular" />
      
    8. 参考

答案 1 :(得分:23)

我使用这样的XAML代码:

<Style x:Key="Hatten">
        <Setter Property="TextElement.FontFamily" Value="Resources/#HATTEN" />
</Style>

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

使用样式:

 <TextBlock x:Name="lblTitle" Style="{DynamicResource Hatten}" FontSize="72"></TextBlock>

答案 2 :(得分:15)

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

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

<强> 它涉及使用比以前更邪恶的字符串,但按预期工作:

<Label FontFamily="pack://application:,,,/Folder1/#Katana">Text</Label> 

Folder1在哪里是您保存TTF文件的项目文件夹。 最后三个笔记:

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

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

  3. 自定义字体也可以添加到项目中,并将“Build Action”设置为“Content”。然而,这不是推荐的方法,为了简单起见,我忽略了这种可能性。

  4. 一些额外的链接

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

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

答案 3 :(得分:5)

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

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

我发现这是列出资源/字体文件夹

内所有文件的解决方案
Fonts.GetFontFamilies(new Uri("pack://application:,,,/resources/fonts/#"))

我希望它可以帮助您整理字体。

答案 4 :(得分:4)

我将xaml用于此

<Window

 FontFamily ="./Fonts/#somefont"

>

我在“Fonts”文件夹中包含了字体文件

答案 5 :(得分:2)

我的项目中的assets文件夹中有一个fonts文件夹。在构建时,它会将这些字体作为内容复制到文件夹中。然后我可以简单地使用以下XAML来使用FontAwesome字体在我的按钮上有一个图标。

<Button Content="&#xf0c9;" FontFamily="./assets/fonts/#FontAwesome">

答案 6 :(得分:1)

以下是为我工作的内容:

(1)将目录添加到项目:font

(2)将ttf字体文件移动到字体目录

(3)将ttf字体文件添加到项目

(4)设置&#34; Build&#34; tff字体文件的属性为&#34;资源&#34;     (注意:我使用&#34;资源&#34;而不是&#34;嵌入式资源&#34;      在组合框选择中。)

(5)打开使用字体的窗口并制作     以下更改:

<Window ... >
    <Window.Resources>
        <FontFamily x:Key="YourFontNickName">
        pack://application:,,,/font/#NameOfFont
        <!-- Note: NameOfFont can be font by double clicking
             on font from explorer and writing down name
             of the font reported.  Its not the same
             as the file name -->
        </FontFamily>   
    </Window.Resources>


    <!-- Use font as Xaml -->
    <StackPanel>
        <Textblock FontFamily="{StaticResource YourFontNickName}">
        This is a test
        </Testblock>
        <Textblock Name="text1"/>
    </StackPanel>
...
</Window>

(6)如果要从代码更改字体。这样做:

public partial class Window1 : Window {

    // Use font as C# Code
    public void UpdateText1() {

            text1.Text      = "Hi There";
            FontFamily ff   = this.Resources["YourFontNickName"] 
                                as FontFamily;
            if (ff == null) {
                Messagebox.Show("Wrong Font Name", "ERROR");
                return;
            }
            text1.FontFamily = ff;
            text1.FontSize   = 30;
    }

    ...
}

答案 7 :(得分:1)

您需要将字体添加为资源项

根据link;您可以按照以下步骤将所需字体添加为应用程序资源文件:

  1. 在大多数情况下,将字体文件复制到项目中的任何位置,如果您要遵循此步骤,则将资源文件复制到名为“ resources”的文件夹中,在项目中创建新文件夹并将其命名为“ resources”,然后将通常具有ttf或otf格式的字体文件复制到该文件夹​​中

  2. 然后您需要将此文件声明为资源文件,这样您就有两个选择:

    1. 右键单击字体文件,选择属性(或在选择字体后按F4键) 然后将“构建操作” 更改为“资源”
    2. 进入项目目录,编辑project-name.csproj文件,然后 以下标签:

      <ItemGroup>            
          <Resource Include="resources\<font-file-name>.ttf" />  
      </ItemGroup>```
      

最后,您可以在应用程序中设置如下的font-family属性:

FontFamily="./Resources/Fonts/#<font-name>"

请注意“字体名称”与字体文件名称不同,您可以打开字体文件并检查字体名称属性(在Microsoft Window中)

fetching font name by opening font file

答案 8 :(得分:1)

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

第1步。创建文件夹Fonts并将字体添加到其中。

enter image description here

第2步。将“构建”操作设置为content,并将“复制到输出目录”设置为Copy always

enter image description here

第3步。构建解决方案以使用Font目录对其进行更新。

第4步。使用FontFamily="Fonts/#font name"

在元素中使用字体

enter image description here

全部完成!

感谢cscience

答案 9 :(得分:0)

我试图用不同的字体来使用它, 它只对我使用./Fonts

这种格式

<FontFamily x:Key="NotoSans">pack://application:,,,./Fonts/#Noto Sans</FontFamily>

答案 10 :(得分:0)

首先)将字体复制到/Resources/Fonts/之类的项目文件夹中,并设置字体属性-> Build Action:Resource

第二)用于代码

FontFamily="/AssemblyNamespace;component/Resources/Fonts/IranSans/#IRANSansWeb Medium"

enter image description here

答案 11 :(得分:0)

种类,真的很简单:

<TextBlock x:Name="lblTitle" FontSize="24" Margin="256,25,178,289" Text="gg" FontFamily="/FontTest;component/#Arvo"></TextBlock>

导入字体时,vs会将其包括在字体列表中。

答案 12 :(得分:0)

尽管@ movgp0的解决方案最初是可行的,但是当我想要 Bold 文本时,它失败了。通过更多的在线搜索,我发现以下适用于所有情况的解决方案:

<Application.Resources>
  <FontFamily x:Key="FiraSansBold">Fonts/FiraSansCondensed-Bold.ttf#Fira Sans Condensed</FontFamily>
  <FontFamily x:Key="FiraSansBoldItalic">Fonts/FiraSansCondensed-BoldItalic.ttf#Fira Sans Condensed</FontFamily>
  <FontFamily x:Key="FiraSansItalic">Fonts/FiraSansCondensed-Italic.ttf#Fira Sans Condensed</FontFamily>
  <FontFamily x:Key="FiraSans">Fonts/FiraSansCondensed-Regular.ttf#Fira Sans Condensed</FontFamily>
</Application.Resources>

用法:<Label FontFamily="{StaticResource FiraSansBold}">SomeBoldedLabel</Label>