How to include external font in WPF application without installing it
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.
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
-
Add a
/Fonts
folder to your solution. -
Add the True Type Fonts (
*.ttf
) files to that folder -
Include the files to the project
-
Select the fonts and add them to the solution
-
Set
BuildAction: Resource
andCopy 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>
-
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>
-
Apply your Fonts like this:
<TextBlock x:Name="myTextBlock" Text="foobar" FontFamily="{StaticResource NotoSans}" FontSize="10.0" FontStyle="Normal" FontWeight="Regular" />
-
You can also set the font imperatively:
myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/"), "./Fonts/#Noto Sans");
Copy to Output Directory
-
Add a
/Fonts
folder to your solution. -
Add the True Type Fonts (
*.ttf
) files to that order -
Include the files to the project
-
Select the fonts and add them to the solution
-
Set
BuildAction: Content
andCopy To Output Directory: Copy if newer
orCopy 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>
-
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>
-
Apply your Fonts like this:
<TextBlock Text="foobar" FontFamily="{StaticResource NotoSansRegular}" FontSize="10.0" FontStyle="Normal" FontWeight="Regular" />
References
- MSDN: Packaging Fonts with Applications
I use such XAML code:
<Style x:Key="Hatten">
<Setter Property="TextElement.FontFamily" Value="Resources/#HATTEN" />
</Style>
#HATTEN - reference to hatten.tft in Resources.
Using the Style:
<TextBlock x:Name="lblTitle" Style="{DynamicResource Hatten}" FontSize="72"></TextBlock>
The best answer to this question I found here
http://geekswithblogs.net/Martinez/archive/2010/01/29/custom-font-in-wpf-application.aspx
SOLUTION It involves using even more wicked string than before but works as expected:
<Label FontFamily="pack://application:,,,/Folder1/#Katana Sans">Text</Label>
Where is Folder1
is a folder of your project where you keep a TTF file.
Three notes at the end:
-
‘Katana Sans’ is the name of the font, not the name of the file. This is significant difference. To get the name of the font simply click the file twice. Note that spaces are included without any changes in this string.
-
Remember to put the hash sign ‘#’ in front of font name. It will not work otherwise.
-
Custom font may also be added to the project with ‘Build Action’ set to ‘Content’. This is not recommended approach however and for the sake of simplicity I ignored this possibility.
Some extra links
https://msdn.microsoft.com/en-us/library/ms753303(v=vs.100).aspx
https://msdn.microsoft.com/en-us/library/cc296385.aspx
I did not found any answer for exactly that. But I found a solution that I did not saw on Internet.
I followed a recommendation of doing a folder and marking all the files inside as Resources. But I needed to enumerate them, and that was my main problem, because I need to load all to my screen without recording the name somewhere. I just want to simple drop another font to that folder and list it.
I found this as a solution to list all the files inside my resources/fonts folder
Fonts.GetFontFamilies(new Uri("pack://application:,,,/resources/fonts/#"))
I expect it to help you organize your fonts.
The easiest way to include external fonts is to
Step 1. Create the folder Fonts
And add your fonts into it.
Step 2. Set Build action to content
and Copy to Output Directory to Copy always
.
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"
All Done!
Thanks to cscience !