C# WinForms中如何使用常规和粗体以外的字体字重?
在C# WinForms中使用SF Mono的Light/Medium/Heavy字重
问题原因
System.Drawing.FontStyle枚举仅提供Regular、Bold、Italic等有限样式,无法直接指定Medium/Light/Heavy这类字重。直接手动输入不存在的FontStyle值会导致运行时自动 fallback 到默认字体(Microsoft Sans Serif)。
解决方法
方法1:直接使用带字重的字体名称
多数多字重字体的不同变体(如Medium/Light/Heavy)会以独立字体名称存在于系统中,直接指定完整名称即可:
// 使用SF Mono Medium this.richTextBox1.Font = new System.Drawing.Font("SF Mono Medium", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); // 使用SF Mono Light this.richTextBox1.Font = new System.Drawing.Font("SF Mono Light", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); // 使用SF Mono Heavy this.richTextBox1.Font = new System.Drawing.Font("SF Mono Heavy", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
注意:需确保系统已安装完整的SF Mono字体包,包含对应字重的变体。
方法2:通过PrivateFontCollection加载本地字体文件(未安装字体时)
如果字体未安装在系统中,可以直接加载本地字体文件:
using System.Drawing.Text; // 初始化私有字体集合 PrivateFontCollection privateFonts = new PrivateFontCollection(); // 添加对应字重的字体文件路径 privateFonts.AddFontFile(@"C:\YourFontPath\SF-Mono-Medium.otf"); // 从集合中获取字体家族并创建Font对象 FontFamily sfMonoMedium = privateFonts.Families[0]; this.richTextBox1.Font = new System.Drawing.Font(sfMonoMedium, 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
验证字体是否可用
可以通过以下代码检查系统中是否存在目标字体变体:
bool isFontAvailable = FontFamily.Families.Any(f => f.Name.Equals("SF Mono Medium", StringComparison.OrdinalIgnoreCase));
内容的提问来源于stack exchange,提问作者HeavyGoat
相关产品推荐
相关产品推荐

