测试是否安装了Font

时间:2008-09-22 09:35:03

标签: .net windows fonts

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

7 个答案:

答案 0 :(得分:25)

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

答案 1 :(得分:15)

How do you get a list of all the installed fonts?

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

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

MSDN:
Enumerating Installed Fonts

答案 2 :(得分:13)

感谢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);
        }
    }

答案 3 :(得分:6)

使用Font创建的其他答案仅在FontStyle.Regular可用时才有效。某些字体,例如Verlag Bold,没有常规样式。创建将失败,例外 Font'Verlag Bold'不支持样式'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;
  }

答案 4 :(得分:2)

关闭GvS的回答:

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

答案 5 :(得分:1)

我将如何做到这一点:

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。 (“阿拉伯语排版”是Windows'字体预览工具中的字体名称。)

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

答案 6 :(得分:0)

对于我来说,我需要检查带有扩展名的字体文件名

例如:verdana.ttf = Verdana Regular,verdanai.ttf = Verdana Italic

using System.IO;

IsFontInstalled("verdana.ttf")

public bool IsFontInstalled(string ContentFontName)
{
    return File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), ContentFontName.ToUpper()));
}