WPF指定路径引用自定义字体无效,求排查方案
我之前也碰到过类似的字体引用失效问题,大概率是这几个环节没处理好,给你梳理下可能遗漏的操作:
确认字体的实际内部名称
你在FontFamily里写的#MyFont不是指文件名,而是字体文件内部注册的正式名称,很多时候这个名称和文件名并不一致。比如文件名是MyFont.ttf,但实际字体名称可能是My Font Regular或者其他。
你可以通过Windows系统查看:右键打开MyFont.ttf,窗口标题栏显示的就是字体的正式名称;或者用PowerShell命令获取准确名称:$fontCollection = New-Object System.Drawing.Text.PrivateFontCollection $fontCollection.AddFontFile("C:/Videowall_INFO/fonts/MyFont.ttf") $fontCollection.Families | Select-Object Name把得到的名称替换掉
#后面的内容,比如如果输出是MyFont Regular,那引用格式就是FontFamily="file:///C:/Videowall_INFO/fonts/MyFont.ttf#MyFont Regular"。修正URI路径格式
WPF的FontFamily引用本地文件时,最好明确使用file:///开头的URI格式(三个斜杠),避免路径解析异常。正确的引用格式应该是:FontFamily="file:///C:/Videowall_INFO/fonts/MyFont.ttf#正确的字体名称"确保字体文件已完全下载且可访问
检查两点:- 启动程序时字体是否已经完全下载完成再初始化XAML界面?如果XAML解析时字体还没下载好,自然无法加载。可以把字体下载逻辑放在界面初始化之前,或者下载完成后动态刷新控件的
FontFamily。 - 程序运行时是否有访问该路径的权限?比如
C:/Videowall_INFO目录是否被设置了读写限制,导致程序无法读取字体文件。
- 启动程序时字体是否已经完全下载完成再初始化XAML界面?如果XAML解析时字体还没下载好,自然无法加载。可以把字体下载逻辑放在界面初始化之前,或者下载完成后动态刷新控件的
可选:将字体注册到系统(解决设计器不识别问题)
如果设计器里始终看不到字体效果,可以手动将字体注册到Windows系统:右键MyFont.ttf选择「安装」,或者用命令行注册(管理员权限运行):reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" /v "MyFont (TrueType)" /t REG_SZ /d "C:\Videowall_INFO\fonts\MyFont.ttf"注册后重启Visual Studio,设计器应该就能识别到字体了。
运行时动态加载字体(针对启动后下载的场景)
如果字体是程序启动后才下载的,XAML静态引用可能无法生效,这时候可以在代码里动态加载并应用:// 下载完成后执行 var fontUri = new Uri("file:///C:/Videowall_INFO/fonts/"); var fontFamily = new System.Windows.Media.FontFamily(fontUri, "MyFont.ttf"); // 给目标控件设置字体 yourTextBlock.FontFamily = fontFamily;
内容的提问来源于stack exchange,提问作者Mauro Caiado

