How to include external font in WPF application without installing it

Viewed 90746

How to include external font in WPF application without installing it

I tried this code

  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;

It working correctly in Windows Form Application but not in WPF.

13 Answers

This are two ways of doing this. One way is to package the fonts inside the application. The other way is to have the fonts in an folder. The difference is mostly the URI you need to load the files.

Package with Application

  1. Add a /Fonts folder to your solution.

  2. Add the True Type Fonts (*.ttf) files to that folder

  3. Include the files to the project

  4. Select the fonts and add them to the solution

  5. Set BuildAction: Resource and Copy To Output Directory: Do not copy. Your .csproj file should now should have a section like this one:

      <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. In App.xaml add <FontFamily> Resources. It should look like in the following code sample. Note that the URI doesn't contain the filename when packing with the application.

     <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. Apply your Fonts like this:

     <TextBlock x:Name="myTextBlock" Text="foobar" FontFamily="{StaticResource NotoSans}" 
                FontSize="10.0" FontStyle="Normal" FontWeight="Regular" />
    
  8. You can also set the font imperatively:

     myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/"), "./Fonts/#Noto Sans");
    

Copy to Output Directory

  1. Add a /Fonts folder to your solution.

  2. Add the True Type Fonts (*.ttf) files to that order

  3. Include the files to the project

  4. Select the fonts and add them to the solution

  5. Set BuildAction: Content and Copy To Output Directory: Copy if newer or Copy always. Your .csproj file should now should have a section like this one:

      <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. In App.xaml add <FontFamily> Resources. It should look like in the following code sample.

     <Applicaton ...>
     <Application.Resources>
         <FontFamily x:Key="NotoSansRegular">./Fonts/NotoSans-Regular.ttf#Noto Sans</FontFamily>
         <FontFamily x:Key="NotoSansItalic">./Fonts/NotoSans-Italic.ttf#Noto Sans</FontFamily>
         <FontFamily x:Key="NotoSansBold">./Fonts/NotoSans-Bold.ttf#Noto Sans</FontFamily>
         <FontFamily x:Key="NotoSansBoldItalic">./Fonts/NotoSans-BoldItalic.ttf#Noto Sans</FontFamily>
         <FontFamily x:Key="NotoSansSymbols">./Fonts/NotoSans-Regular.ttf#Noto Sans Symbols</FontFamily>
     </Application.Resources>
     </Application>
    
  7. Apply your Fonts like this:

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

References

The easiest way to include external fonts is to

Step 1. Create the folder Fonts And add your fonts into it.

enter image description here

Step 2. Set Build action to content and Copy to Output Directory to Copy always.

enter image description here

Step 3. Build the Solution to update it with the Font directory.

Step 4. Use the font in your elements using FontFamily="Fonts/#font name"

enter image description here

All Done!

Thanks to cscience !

First) Copy fonts to project folder like /Resources/Fonts/ and set font-properties -> Build Action:Resource

Second) Used on code

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

enter image description here

Although the solution from @movgp0 worked at first, it failed when I wanted a Bold text. By searching a bit more online I found the following solution that works in all cases:

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

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

You need to add fonts as resource item

according to the link; you may add your desired font as application resource file by following these steps:

  1. copy your font file to anywhere in your project in most cases resource files is copied into a folder named "resources" if you want to follow this, create new folder in your project and name it as "resources" then copy your font file which is usually have ttf or otf format into that folder

  2. then you need to declare this file as a resource file for doing so you have two options:

    1. right click on your font file, select properties (or press F4 after selecting it) and then change "Build Action" to "Resource"
    2. go into your projects directory edit project-name.csproj file and the following tag:

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

finally within you application you may set font-family property like this:

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

be careful 'font-name' is different from font-file-name you may open font file and check for font name property (in Microsoft Window)

fetching font name by opening font file

Here's What Worked for me:

(1) Add Directory to project: font

(2) Move ttf font file into font directory

(3) Add ttf font file to project

(4) Set the "Build" Property of the tff font file to "Resource" (Note: I used "Resource" instead of "Embedded Resource" in the combobox selection.)

(5) Open the Window where you are using the font and make the following changes:

<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) If you want to change the font from code. Do this:

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

    ...
}

I was trying to get this to work as well with a different font, it only worked for me in this format with the ./Fonts

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

Kind of, Really easy:

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

When you import a font, vs will gonna include it in font list.

Related