C#如何在代码中定义字体回退序列

时间:2016-12-13 06:06:07

标签: c# winforms fonts

我尝试在代码中定义字体后备序列,我在here

中引用
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        FontFamily f = new FontFamily("Comic Sans MS, Verdana");
    }
}

但我有错误:"其他信息:字体' Comic Sans MS,Verdana'无法找到。"

如何在代码中定义字体后备序列。

3 个答案:

答案 0 :(得分:1)

因为" Comic Sans MS,Verdana"没有字体名称。您可以定义字体名称数组。您可以为此数组添加名称。

string[] fontName = new string[] { "Comic Sans MS", "Verdana" };
FontFamily f = new FontFamily(fontName[0]);

答案 1 :(得分:1)

我认为FontFamily不适用于该任务,我担心Windows Forms没有自动回退字体。 请注意,该示例适用于来自PresentationCore assy的System.Windows.Media,而不适用于System.Drawing.FontFamily。 您必须尝试手动加载字体,然后在尝试分配给Form.Font

之前检查Name属性

你可以试试这个:

Font font = null;
string[] fontNames = {"Comic Sans MS","Verdana"};
foreach (var fontName in fontNames)
{
    font = new Font(fontName, 12.0f);
    if (font.Name == fontName) break;
}
this.Font = font;

答案 2 :(得分:-1)

您正在使用WinForms,但查看WPF文档。 The WinForms FontFamily class构造函数不支持显式回退字体。只能为FontFamily构造函数指定一个字体的面部名称。如果找不到指定的字体,操作系统会根据various heuristics 自动选择回退(本文非常旧,所以有些这些细节已经改变,但其中许多都是相同的)

通常,WinForms应用程序应该对特定字体进行硬编码。您希望在UI中使用的是标准的系统对话框字体,您可以使用SystemFonts.MessageBoxFont获取该字体。在每个表单的构造函数中设置它,以便所有子控件自动拾取它,如建议here。这不仅可以确保字体可用,还可以让您的UI适应用户的偏好。

如果你绝对必须硬编码字体,那么你需要enumerate the installed fonts并使用手动后备算法 - 看看你想要的字体是否存在于枚举列表中,如果不存在,则回归到替代。请注意" Comic Sans MS"和" Verdana"是安全的"字体;除非用户已明确删除它们,否则它们将存在于.NET Framework可以运行的任何Windows系统上。 (他们可能会。漫画Sans是令人厌恶的。)

也许更好的选择(同样,如果你绝对必须拥有自定义的非标准字体),可能需要将您需要的字体与应用程序捆绑在一起。您可以通过creating a private font collection执行此操作,https://www.dotnetperls.com/enum-flags专门为您的应用程序维护字体。私有字体集合可以包括应用程序供应商提供的安装在系统上的字体文件。