能否参照Xamarin.Forms用法在WinForms按钮中使用Fontello字形?
解决方案
这个需求完全可以实现。你测试普通字符"A"能正常显示,说明自定义字体的加载链路是通的,字形不显示基本是以下两个核心问题导致的:
1. 字形编码值不匹配
Fontello导出的自定义图标默认会映射到Unicode私有使用区(编码范围U+E000 ~ U+F8FF),你使用的\u0E00属于泰文统一编码区段,几乎不可能和你导出的ttf文件里的图标编码对应。
你可以打开Fontello下载包内的demo.html文件,找到目标笑脸图标对应的实际编码值,大部分场景下导出的图标编码都是\ueXXX格式的私有区编码,直接使用该编码值即可。
2. 字体实例创建和渲染配置错误
不要通过字体族名称间接创建字体对象,必须直接从PrivateFontCollection加载完成的字体族生成Font实例,同时要保证全局文本渲染配置兼容私有字体,正确实现代码如下:
using System.Drawing.Text; // 声明为全局/窗体级变量,不要using释放,否则字体会失效 private readonly PrivateFontCollection _iconFontCollection = new PrivateFontCollection(); private void MainForm_Load(object sender, EventArgs e) { // 加载字体文件 string fontFullPath = Path.Combine(Application.StartupPath, "Fonts", "smiley.ttf"); _iconFontCollection.AddFontFile(fontFullPath); // 直接从加载的字体族创建字体实例 Font smileyFont = new Font(_iconFontCollection.Families[0], 18f, FontStyle.Regular); // 配置按钮 iconButton.UseCompatibleTextRendering = true; iconButton.Font = smileyFont; // 替换为你从demo页查到的实际图标编码 iconButton.Text = "\ue800"; }
同时需要修改Program.cs里的启动配置,把兼容文本渲染开关打开:
// 原默认值为false,改为true Application.SetCompatibleTextRenderingDefault(true);
额外排查点
如果按以上配置后还是不显示,可以直接双击打开smiley.ttf文件查看系统字体预览,翻到对应编码位置确认目标笑脸图标确实被打包进了字体文件,避免Fontello导出时漏选图标。
配置完成后即可和Xamarin.Forms场景一样,直接通过Text属性赋值显示字体图标,也可以配合按钮的圆角绘制实现相同的UI效果。
内容的提问来源于stack exchange,提问作者IV.
相关产品推荐
相关产品推荐

