如果安装测试字体(Test if a Font is installed)

2019-06-14 18:18发布

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

Answer 1:

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
    }
}


Answer 2:

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

var fontsCollection = new InstalledFontCollection();
foreach (var fontFamiliy in fontsCollection.Families)
{
    if (fontFamiliy.Name == fontName) ... \\ installed
}

见InstalledFontCollection类的细节。

MSDN:
枚举安装的字体



Answer 3:

感谢杰夫,我有更好的阅读字体类的文档:

如果familyName参数指定了未安装在机器上运行的应用程序或不支持的字体,微软无衬线将被取代。

这方面的知识的结果:

    private bool IsFontInstalled(string fontName) {
        using (var testFont = new Font(fontName, 8)) {
            return 0 == string.Compare(
              fontName,
              testFont.Name,
              StringComparison.InvariantCultureIgnoreCase);
        }
    }


Answer 4:

其他答案使用建议Font创作如果只工作FontStyle.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;
  }


Answer 5:

去关GVS”的回答:

    private static bool IsFontInstalled(string fontName)
    {
        using (var testFont = new Font(fontName, 8))
            return fontName.Equals(testFont.Name, StringComparison.InvariantCultureIgnoreCase);
    }


Answer 6:

这是我会怎么做:

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 \字体。 例如,我有安装的字体被称为“阿拉伯Typsetting常规”。 IsFontInstalled("Arabic Typesetting Regular")将返回false,但IsFontInstalled("Arabic Typesetting")将返回true。 (“阿拉伯语排版”是在Windows的字体预览工具的字体的名称。)

至于资源走,我跑了一个测试,我调用此方法多次,并测试每次都只有几毫秒完成。 我的机器有点过强,但除非你需要非常频繁地运行此查询,似乎表现非常好(即使你做到了,这就是高速缓存是)。



文章来源: Test if a Font is installed