欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > WPF如何使用外部字体

WPF如何使用外部字体

2024/12/24 11:41:22 来源:https://blog.csdn.net/qq_22933729/article/details/143475474  浏览:    关键词:WPF如何使用外部字体

当我们所使用的字体,系统不存在怎么办?

一种方式就是给系统安装该字体,这种方式安装的字体能够全局生效。

控制面板中可以看到本机已经安装了哪些字体:

 

第二种方法就是免安装,直接加载字体资源。

一. 全局安装:

[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)的操作系统里面不尽相同。整个安装过程相对会麻烦一些,卸载软件的时候,还得考虑需不需要卸载我们软件安装的字体。于是我们有了第二种方案,免安装使用字体!

字体引入方式:

使用xaml方式:


<TextBlock Text="text1"><TextBlock.FontFamily><FontFamily>/程序集名称;component/Font/字体文件名#字体名称</FontFamily></TextBlock.FontFamily>
</TextBlock>

后台代码引用:

textBlock.FontFamily=new FontFamily(new Uri("/程序集名称;component/Font/字体文件名"),"字体名称")

这里需要注意下,引入字体的路径是字体文件的相对或绝对路径,通过 #号连接 字体名称来引入。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com