字体引用
准备字体文件,以ttf或otf格式结尾;复制到项目下的Font
文件夹中,
并设置Build Action(生成操作)
为Resource(资源)
;
在App.xaml中或者你需要的地方添加字体资源的定义;
资源定义处引用的并不是字体文件的名称,而是字体名称。
字体的具体名称可以打开字体文件进行查看。
注意
引用字体的时候
#
后面的是`字体的名称不是文件名。前面的文件名可写可不写,建议不写。
字体名称一定要写
1 | <Application.Resources> |
当然写上文件名称也可以
1 | <Application.Resources> |
或者页面内引用
1 | <Window.Resources> |
使用
1 | <TextBlock Text="10:30" FontFamily="{StaticResource UnidreamLed}" FontSize="16"/> |
路径的写法
引用的时候可以这样写
1 | <FontFamily x:Key="SiYuanHeiTi">pack://application:,,,/Font/#思源黑体 CN</FontFamily> |
三种引用字体的方式:
第一种方式使用了一种资源标识符(pack URI),这是一种通用的WPF(Windows Presentation Foundation)资源引用方式,它可以访问打包在应用程序中的资源。
第二种方式看起来是在引用应用程序中的一个组件(Component),然后指定了字体文件的路径。
这个路径看起来更具体,可能是应用程序的内部组件路径。
第三种方式可能是相对路径,它直接指定了字体文件的路径。
这种方式可能需要相对于当前XAML文件的位置指定路径。
引用字体名规则
注意
里面的字体类似于
1 | 思源黑体 CN Bold |
引用的时候要这样写
1 | <FontFamily x:Key="SiYuanHeiTi">pack://application:,,,/Font/#思源黑体 CN</FontFamily> |
三种引用字体的方式:
第一种方式使用了一种资源标识符(pack URI),这是一种通用的WPF(Windows Presentation Foundation)资源引用方式,它可以访问打包在应用程序中的资源。
第二种方式看起来是在引用应用程序中的一个组件(Component),然后指定了字体文件的路径。
这个路径看起来更具体,可能是应用程序的内部组件路径。
第三种方式可能是相对路径,它直接指定了字体文件的路径。
这种方式可能需要相对于当前XAML文件的位置指定路径。
错误写法
1 | <FontFamily x:Key="SyRegular">pack://application:,,,/Font/#思源黑体 CN Regular</FontFamily> |
这种写法会导致设置FontWeight="Medium"
设置无效。
生效范围
全局生效
要在 WPF 应用程序中全局设置字体,你可以在应用程序的主题中定义全局字体。
你可以在 App.xaml
文件中定义一个主题,并在其中设置全局字体。
例如:
1 | <Application x:Class="YourAppName.App" |
这将使应用程序中所有控件的字体都设置为指定的字体。
注意下面的写法是不生效的:
1 | <Style TargetType="Control"> |
单个生效
1 | <TextBlock FontFamily="pack://application:,,,/Font/#思源黑体 CN"/> |
或者
1 | <TextBlock FontFamily="{StaticResource SiYuanHeiTi}"/> |
字体权重
在 WPF 中,FontWeight
的可选值按从细到粗的顺序排序为:
Thin
ExtraLight
Light
Normal
或Regular
(默认值)Medium
SemiBold
Bold
ExtraBold
默认情况下,FontWeight
的值为 Normal
,即正常字体。
如果引用的自定义字体只有 Regular 和 Medium 两种权重,而 FontWeight 属性没有显式指定,那么通常情况下,默认的字体权重会是 Regular。
这是因为 “Normal” 权重的别名通常是 “Regular”,而且 “Regular” 通常被视为默认的权重。
如果 WPF 中的字体加载器在字体文件中找不到 “Normal” 或者 “Regular” 这样的权重名称,它可能会尝试使用第一个合法的权重定义作为默认值。
在这种情况下,如果没有 “Regular”,它可能会选择 “Medium” 作为默认权重。
为了确保没有歧义,建议在定义字体权重时显式指定所需的权重值
例如:
1 | <TextBlock Text="Sample Text" FontWeight="Medium"/> |
这样即使字体文件中没有 “Normal” 权重,你也可以保证使用了 “Medium” 权重。
设置字体失效
假如有如下两种自定义Button样式的方式:
第一个使用ContentPresenter
这种方式通过全局设置的字体是生效的,但是组件本身设置字体无效。
1 | <Style x:Key="ZImgTxtBtn" TargetType="{x:Type views:ZRoundButton}"> |
第二个使用TextBlock
这种方式通过全局设置的字体无效,但是组件本身设置字体生效。
1 | <Style x:Key="MyButton" TargetType="{x:Type Button}"> |
是因为ContentPresenter并不直接继承自Button的字体属性。
可以尝试在内部添加一个具有所需字体属性的文本元素,比如TextBlock,然后将ContentPresenter的内容设置为该TextBlock。
这样就能确保内容继承了Button的字体设置。
例如:
1 | <ControlTemplate TargetType="Button"> |
通过内部嵌套TextBlock,并使用TemplateBinding绑定Button的字体属性,可以确保内容的字体设置与Button一致。