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

3

我尝试在代码中定义字体回退序列,参考了这里


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

但我遇到了一个错误:“附加信息:找不到字体'Comic Sans MS,Verdana'。”

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

3个回答

1
因为“Comic Sans MS,Verdana”不是字体名称。您可以定义一个字体名称数组。您可以向此数组添加名称。
string[] fontName = new string[] { "Comic Sans MS", "Verdana" };
FontFamily f = new FontFamily(fontName[0]);

1
不,我希望这个字体作为备用字体。如果字符无法在“Comic Sans MS”字体中显示,则自动使用“Verdana”来显示字符。 - user3435791

1
我认为FontFamily并不适用于这项任务,而且我担心Windows Forms没有自动回退字体。 请注意,示例是针对PresentationCore程序集中的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;

0
你正在使用WinForms,但查看WPF文档。 WinForms FontFamily 构造函数不支持显式回退字体。对于FontFamily构造函数,只能指定一个字体的面名。如果找不到该指定字体,则操作系统会根据各种启发式方法自动选择回退(本文非常老旧,因此某些详细信息已更改,但许多内容仍然相同)

通常情况下,WinForms应用程序不应该硬编码特定的字体。您想在UI中使用的是标准系统对话框字体,可以通过SystemFonts.MessageBoxFont获取。在每个窗体的构造函数中设置它,这样所有子控件都会自动使用它,如此处所建议的那样。这不仅确保字体可用,而且还允许您的UI适应用户的偏好。

如果您绝对必须硬编码字体,则需要枚举已安装的字体并使用手动回退算法-查看您想要的字体是否存在于枚举列表中,如果不存在,则退回到替代方案。请注意,“Comic Sans MS”和“Verdana”都是“安全”的字体;除非用户已明确删除它们,否则它们将在.NET Framework可以运行的任何Windows系统上都存在。(他们可能已经删除了它们。Comic Sans是一种令人憎恶的字体。)

如果你非常需要自定义非标准字体,也许更好的选择是将所需字体与应用程序捆绑在一起。你可以通过创建私有字体集合来实现这一点,该集合专门为你的应用程序维护字体。私有字体集合可以包括应用程序供应商提供的未安装在系统上的字体文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接