当我们所使用的字体,系统不存在怎么办?
一种方式就是给系统安装该字体,这种方式安装的字体能够全局生效。
控制面板中可以看到本机已经安装了哪些字体:
第二种方法就是免安装,直接加载字体资源。
一. 全局安装:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern int WriteProfileString(string lpszSection, string lpszKeyName, string lpszString);
[DllImport("gdi32")]
public static extern int AddFontResource(string lpFileName);
/// <summary>
/// 安装字体
/// </summary>
/// <param name="fontFilePath">字体文件全路径</param>
/// <returns>是否成功安装字体</returns>
/// <exception cref="UnauthorizedAccessException">不是管理员运行程序</exception>
/// <exception cref="Exception">字体安装失败</exception>
public static bool InstallFont(string fontFilePath)
{
try
{
System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
//判断当前登录用户是否为管理员
if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator) == false)
{
throw new UnauthorizedAccessException("当前用户无管理员权限,无法安装字体。");
}
//获取Windows字体文件夹路径
string fontPath = Path.Combine(System.Environment.GetEnvironmentVariable("WINDIR"), "fonts", Path.GetFileName(fontFilePath));
//检测系统是否已安装该字体
if (!File.Exists(fontPath))
{
File.Copy(fontFilePath, fontPath); //font是程序目录下放字体的文件夹
AddFontResource(fontPath);
//安装字体
WriteProfileString("fonts", Path.GetFileNameWithoutExtension(fontFilePath) + "(TrueType)", Path.GetFileName(fontFilePath));
}
}
catch (Exception ex)
{
throw new Exception(string.Format($"[{Path.GetFileNameWithoutExtension(fontFilePath)}] 字体安装失败!原因:{ex.Message}"));
}
return true;
}
这种方案需要管理员权限才能安装,并且安装的字体路径在不同(win7,win10,win11)的操作系统里面不尽相同。整个安装过程相对会麻烦一些,卸载软件的时候,还得考虑需不需要卸载我们软件安装的字体。于是我们有了第二种方案,免安装使用字体!
字体引入方式:
<TextBlock Text="text1">
<TextBlock.FontFamily>
<FontFamily>/程序集名称;component/Font/字体文件名#字体名称</FontFamily>
</TextBlock.FontFamily>
</TextBlock>
textBlock.FontFamily=new FontFamily(new Uri("/程序集名称;component/Font/字体文件名"),"字体名称")
这里需要注意下,引入字体的路径是字体文件的相对或绝对路径,通过#
号连接字体名称
来引入。
关注我,了解更多技术分享,微信公众号:
欢迎转载分享,如若转载,请标注署名。
本文会经常更新,请阅读原文: https://huchengv5.gitee.io//post/WPF-WPF%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E5%A4%96%E9%83%A8%E5%AD%97%E4%BD%93.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名胡承(包含链接: https://huchengv5.gitee.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。