31

有没有一种简单的方法(在.Net中)来测试当前机器上是否安装了字体?

4

7 回答 7

31
string fontName = "Consolas";
float fontSize = 12;

using (Font fontTester = new Font( 
       fontName, 
       fontSize, 
       FontStyle.Regular, 
       GraphicsUnit.Pixel)) 
{
    if (fontTester.Name == fontName)
    {
        // Font exists
    }
    else
    {
        // Font doesn't exist
    }
}
于 2008-09-22T09:39:17.213 回答
24

你如何获得所有已安装字体的列表?

var fontsCollection = new InstalledFontCollection();
foreach (var fontFamily in fontsCollection.Families)
{
    if (fontFamily.Name == fontName) {...} \\ check if font is installed
}

有关详细信息,请参阅InstalledFontCollection 类

MSDN:
枚举已安装的字体

于 2008-09-22T09:38:57.590 回答
15

感谢 Jeff,我最好阅读 Font 类的文档:

如果 familyName 参数指定的字体未安装在运行应用程序的计算机上或不受支持,则将替换 Microsoft Sans Serif。

这些知识的结果:

    private bool IsFontInstalled(string fontName) {
        using (var testFont = new Font(fontName, 8)) {
            return 0 == string.Compare(
              fontName,
              testFont.Name,
              StringComparison.InvariantCultureIgnoreCase);
        }
    }
于 2008-09-22T09:56:24.397 回答
6

Font使用创建提出的其他答案仅在可用时才FontStyle.Regular有效。某些字体(例如 Verlag Bold)没有常规样式。创建将失败,并出现异常Font 'Verlag Bold' does not support style 'Regular'。您需要检查应用程序需要的样式。解决方案如下:

  public static bool IsFontInstalled(string fontName)
  {
     bool installed = IsFontInstalled(fontName, FontStyle.Regular);
     if (!installed) { installed = IsFontInstalled(fontName, FontStyle.Bold); }
     if (!installed) { installed = IsFontInstalled(fontName, FontStyle.Italic); }

     return installed;
  }

  public static bool IsFontInstalled(string fontName, FontStyle style)
  {
     bool installed = false;
     const float emSize = 8.0f;

     try
     {
        using (var testFont = new Font(fontName, emSize, style))
        {
           installed = (0 == string.Compare(fontName, testFont.Name, StringComparison.InvariantCultureIgnoreCase));
        }
     }
     catch
     {
     }

     return installed;
  }
于 2013-07-11T14:57:29.977 回答
3

这是我的做法:

private static bool IsFontInstalled(string name)
{
    using (InstalledFontCollection fontsCollection = new InstalledFontCollection())
    {
        return fontsCollection.Families
            .Any(x => x.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase));
    }
}

需要注意的一点是,该Name属性并不总是您在 C:\WINDOWS\Fonts 中所期望的。例如,我安装了一种名为“Arabic Typsetting Regular”的字体。IsFontInstalled("Arabic Typesetting Regular")将返回 false,但IsFontInstalled("Arabic Typesetting")将返回 true。(“Arabic Typesetting”是Windows字体预览工具中的字体名称。)

就资源而言,我运行了一个测试,多次调用此方法,每次测试仅在几毫秒内完成。我的机器有点过载,但除非您需要非常频繁地运行此查询,否则性能似乎非常好(即使您这样做了,这也是缓存的用途)。

于 2014-04-24T21:47:52.317 回答
2

脱离 GvS 的回答:

    private static bool IsFontInstalled(string fontName)
    {
        using (var testFont = new Font(fontName, 8))
            return fontName.Equals(testFont.Name, StringComparison.InvariantCultureIgnoreCase);
    }
于 2013-02-01T19:35:17.853 回答
0

在我的情况下,我需要检查带有扩展名的字体文件名

例如:verdana.ttf = Verdana 常规,verdanai.ttf = Verdana 斜体

using System.IO;

IsFontInstalled("verdana.ttf")

public bool IsFontInstalled(string ContentFontName)
{
    return File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), ContentFontName.ToUpper()));
}
于 2020-04-13T08:44:41.483 回答