有没有一种简单的方法(在.Net中)来测试当前机器上是否安装了字体?
7 回答
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 fontFamily in fontsCollection.Families)
{
if (fontFamily.Name == fontName) {...} \\ check if font is 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' 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;
}
这是我的做法:
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字体预览工具中的字体名称。)
就资源而言,我运行了一个测试,多次调用此方法,每次测试仅在几毫秒内完成。我的机器有点过载,但除非您需要非常频繁地运行此查询,否则性能似乎非常好(即使您这样做了,这也是缓存的用途)。
脱离 GvS 的回答:
private static bool IsFontInstalled(string fontName)
{
using (var testFont = new Font(fontName, 8))
return fontName.Equals(testFont.Name, StringComparison.InvariantCultureIgnoreCase);
}
在我的情况下,我需要检查带有扩展名的字体文件名
例如: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()));
}