如何在不安装的情况下在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中无法正常工作。
答案 0 :(得分:81)
这是两种方法。一种方法是将字体打包在应用程序中。另一种方法是将字体分别输出到输出文件夹。差异主要是加载文件所需的URI。
/Fonts
文件夹。 *.ttf
)文件添加到该文件夹设置BuildAction: Resource
和Copy 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>
在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>
像这样应用你的字体:
<TextBlock x:Name="myTextBlock" Text="foobar" FontFamily="{StaticResource NotoSans}"
FontSize="10.0" FontStyle="Normal" FontWeight="Regular" />
您还可以强制设置字体:
myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/"), "./Fonts/#Noto Sans");
/Fonts
文件夹。 *.ttf
)文件添加到该订单设置BuildAction: Content
和Copy 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>
在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>
像这样应用你的字体:
<TextBlock Text="foobar" FontFamily="{StaticResource NotoSansRegular}"
FontSize="10.0" FontStyle="Normal" FontWeight="Regular" />
答案 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文件的项目文件夹。
最后三个笔记:
'Katana'是字体的名称,而不是文件的名称。这是显着的差异。要获取字体名称,只需单击该文件两次。
请记住在字体名称前加上井号“#”。否则它将不起作用。
自定义字体也可以添加到项目中,并将“Build Action”设置为“Content”。然而,这不是推荐的方法,为了简单起见,我忽略了这种可能性。
一些额外的链接
https://msdn.microsoft.com/en-us/library/ms753303(v=vs.100).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="" 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;您可以按照以下步骤将所需字体添加为应用程序资源文件:
在大多数情况下,将字体文件复制到项目中的任何位置,如果您要遵循此步骤,则将资源文件复制到名为“ resources”的文件夹中,在项目中创建新文件夹并将其命名为“ resources”,然后将通常具有ttf或otf格式的字体文件复制到该文件夹中
然后您需要将此文件声明为资源文件,这样您就有两个选择:
进入项目目录,编辑project-name.csproj
文件,然后
以下标签:
<ItemGroup>
<Resource Include="resources\<font-file-name>.ttf" />
</ItemGroup>```
最后,您可以在应用程序中设置如下的font-family属性:
FontFamily="./Resources/Fonts/#<font-name>"
请注意“字体名称”与字体文件名称不同,您可以打开字体文件并检查字体名称属性(在Microsoft Window中)
答案 8 :(得分:1)
包含外部字体的最简单方法是
第1步。创建文件夹Fonts
并将字体添加到其中。
第2步。将“构建”操作设置为content
,并将“复制到输出目录”设置为Copy always
。
第3步。构建解决方案以使用Font目录对其进行更新。
第4步。使用FontFamily="Fonts/#font name"
全部完成!
感谢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"
答案 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>