如何使用<FontFamily>引用资源字体?资源字典字体识别异常处理
我之前也碰到过一模一样的问题!你这个情况根本不是只能识别字体名称,大概率是资源字典加载顺序或者字体文件的构建配置在搞鬼,咱们一步步捋清楚:
先检查最基础的字体配置
首先确认你的字体文件(比如anticon.ttf)的构建操作是不是设成了Resource?右键字体文件→属性→生成操作,一定要选Resource,这是WPF能把字体打包进程序的前提,要是选成了Content或者其他,路径再对也加载不出来。
为啥直接写在Style里能跑,资源字典里不行?
你在Style的Setter里直接写pack://application:,,,/Ant.WPF;component/Resources/#anticon能正常工作,是因为WPF解析这个Style的时候,会实时顺着URI去找字体资源;但把FontFamily定义成资源字典里的静态资源时,就可能踩资源加载顺序的坑——资源字典加载的时候,字体还没被完全初始化,导致解析失败。
给你几个可行的解决办法
办法1:补全字体文件名到URI里
试试把字体文件名也加到FontFamily的URI里,比如你的字体文件是anticon.ttf,那资源字典里的定义改成:
<FontFamily x:Key="anticon-uri">pack://application:,,,/Ant.WPF;component/Resources/anticon.ttf#anticon</FontFamily>
有时候WPF在解析资源字典里的FontFamily时,需要明确指定文件名才能精准定位到字体。
办法2:调整资源字典的合并顺序
如果你的资源字典是在App.xaml里合并的,把包含字体资源的字典放在最前面合并,这样后面引用这个FontFamily资源时,字体已经加载完成了:
<Application.Resources> <!-- 先加载字体资源字典 --> <ResourceDictionary Source="Resources/FontResources.xaml" /> <!-- 再加载其他样式字典 --> <ResourceDictionary Source="Resources/StyleResources.xaml" /> </Application.Resources>
办法3:用字符串资源替代FontFamily资源(稳定又省心)
你现在用的直接在Style里写URI的方式其实很稳,要是想兼顾复用性,可以把这个URI抽成字符串资源,然后在Setter里引用:
<!-- 资源字典里定义字符串资源 --> <system:String x:Key="AnticonFontFamily">pack://application:,,,/Ant.WPF;component/Resources/#anticon</system:String> <!-- Style里引用这个字符串 --> <Style x:Key="anticon" TargetType="TextBlock"> <Setter Property="FontFamily" Value="{StaticResource AnticonFontFamily}" /> <!-- 其他样式设置 --> </Style>
这种方式既保留了资源复用的优势,又避开了FontFamily资源解析的坑,亲测好用。
总结一下,WPF完全支持通过URI引用嵌入式字体,只是资源字典的加载逻辑和直接写在Style里不一样,调整下配置或者定义方式就能搞定啦!
内容的提问来源于stack exchange,提问作者China.Wu

