WPF多个同族字体文件
WPF multiple Font files of the same family
我有以下字体文件。
MyFont-Regular.tff
MyFont-Bold.tff
MyFont-Italic.tff
如何使用它们?
我可以做到以下几点,
<TextBlock
FontFamily="/Fonts/MyFont/MyFont-Regular.ttf#My Font"
Text="This is my font"/>
如果我不想使用斜体和粗体等样式怎么办?我不能声明 My Font
由多个文件组成,每个文件都包含字体样式吗?
你不能。但是,您可以将自定义字体包装成 style/resource:
<App.Resources>
<FontFamily x:Key="CustomRegular">/Fonts/MyFont/MyFont-Regular.ttf#My Font</FontFamily>
<FontFamily x:Key="CustomBold">/Fonts/MyFont/MyFont-Bold.ttf#My Font</FontFamily>
<FontFamily x:Key="CustomItalic">/Fonts/MyFont/MyFont-Italic.ttf#My Font</FontFamily>
</App.Resources>
然后像这样使用它:
<TextBlock FontFamily="{StaticResource CustomItalic}">Hello world</TextBlock>
需要部分文字斜体吗?
<TextBlock FontFamily="{StaticResource CustomRegular}">
<Run FontFamily="{StaticResource CustomItalic}">Hello</Run>
<Run>World</Run>
</TextBlock>
祝你好运。
这是一个更好的方法:
- 将
/Fonts
文件夹添加到您的解决方案。
- 将 True Type 字体 (
*.ttf
) 文件添加到该顺序
- 将文件包含到项目中
- Select字体并将其添加到解决方案
设置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/#NotoSans</FontFamily>
<FontFamily x:Key="NotoSansSymbols">pack://application:,,,/Fonts/#NotoSansSymbols</FontFamily>
</Application.Resources>
</Application>
像这样应用您的字体:
<TextBlock x:Name="myTextBlock" Text="foobar" FontFamily="{StaticResource NotoSans}"
FontSize="10.0" FontStyle="Normal" FontWeight="Regular" />
也可以强制设置字体:
var uri = new Uri("pack://application:,,,/");
myTextBlock.FontFamily = new FontFamily(uri, "./Fonts/#NotoSans");
参考资料
这实际上是可能的!与其指定 FontFamily="/Fonts/MyFont/MyFont-Regular.ttf#My Font"
,不如仅指定包含字体文件的文件夹和字体名称:
FontFamily="/Fonts/MyFont/#My Font"
WPF 然后检查该目录中的所有字体文件,如果 字体名称 与 #
之后指定的名称匹配,则将它们加载到一个 FontFamily
中。
这样您就可以轻松地在资源中定义一个 FontFamily
并通过指定属性 FontWeight
和 FontStyle
:
使用其样式
<FontFamily x:Key="MyFont">/Fonts/MyFont/#My Font</FontFamily>
<!-- somewhere else: -->
<TextBlock
Text="Hello World"
FontFamily="{StaticResource MyFont}"
FontWeight="Bold"/>
这将自动使用该文件夹中的 TTF 文件。
我有以下字体文件。
MyFont-Regular.tff
MyFont-Bold.tff
MyFont-Italic.tff
如何使用它们?
我可以做到以下几点,
<TextBlock
FontFamily="/Fonts/MyFont/MyFont-Regular.ttf#My Font"
Text="This is my font"/>
如果我不想使用斜体和粗体等样式怎么办?我不能声明 My Font
由多个文件组成,每个文件都包含字体样式吗?
你不能。但是,您可以将自定义字体包装成 style/resource:
<App.Resources>
<FontFamily x:Key="CustomRegular">/Fonts/MyFont/MyFont-Regular.ttf#My Font</FontFamily>
<FontFamily x:Key="CustomBold">/Fonts/MyFont/MyFont-Bold.ttf#My Font</FontFamily>
<FontFamily x:Key="CustomItalic">/Fonts/MyFont/MyFont-Italic.ttf#My Font</FontFamily>
</App.Resources>
然后像这样使用它:
<TextBlock FontFamily="{StaticResource CustomItalic}">Hello world</TextBlock>
需要部分文字斜体吗?
<TextBlock FontFamily="{StaticResource CustomRegular}">
<Run FontFamily="{StaticResource CustomItalic}">Hello</Run>
<Run>World</Run>
</TextBlock>
祝你好运。
这是一个更好的方法:
- 将
/Fonts
文件夹添加到您的解决方案。 - 将 True Type 字体 (
*.ttf
) 文件添加到该顺序 - 将文件包含到项目中
- Select字体并将其添加到解决方案
设置
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/#NotoSans</FontFamily> <FontFamily x:Key="NotoSansSymbols">pack://application:,,,/Fonts/#NotoSansSymbols</FontFamily> </Application.Resources> </Application>
像这样应用您的字体:
<TextBlock x:Name="myTextBlock" Text="foobar" FontFamily="{StaticResource NotoSans}" FontSize="10.0" FontStyle="Normal" FontWeight="Regular" />
也可以强制设置字体:
var uri = new Uri("pack://application:,,,/"); myTextBlock.FontFamily = new FontFamily(uri, "./Fonts/#NotoSans");
参考资料
这实际上是可能的!与其指定 FontFamily="/Fonts/MyFont/MyFont-Regular.ttf#My Font"
,不如仅指定包含字体文件的文件夹和字体名称:
FontFamily="/Fonts/MyFont/#My Font"
WPF 然后检查该目录中的所有字体文件,如果 字体名称 与 #
之后指定的名称匹配,则将它们加载到一个 FontFamily
中。
这样您就可以轻松地在资源中定义一个 FontFamily
并通过指定属性 FontWeight
和 FontStyle
:
<FontFamily x:Key="MyFont">/Fonts/MyFont/#My Font</FontFamily>
<!-- somewhere else: -->
<TextBlock
Text="Hello World"
FontFamily="{StaticResource MyFont}"
FontWeight="Bold"/>
这将自动使用该文件夹中的 TTF 文件。