testing是否安装了字体

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

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

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

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

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

MSDN:
枚举安装的字体

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

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

走出GvS的答案:

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

以下是我将如何做到这一点:

 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的字体预览工具中的字体的名称。)

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