Prüft, ob ein Font installiert
Frage
Gibt es eine einfache Art und Weise (in .NET) zu testen, ob eine Schriftart auf dem aktuellen Computer installiert ist?
Lösung
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
}
}
Andere Tipps
Wie bekommt man ein Liste aller installierten Schriftarten?
var fontsCollection = new InstalledFontCollection();
foreach (var fontFamiliy in fontsCollection.Families)
{
if (fontFamiliy.Name == fontName) ... \\ installed
}
Siehe InstalledFontCollection Klasse für Details .
Dank Jeff, ich habe besser die Dokumentation der Font-Klasse lesen:
Wenn der Parameter family gibt eine Schriftart, die nicht installiert ist auf der Maschine, die Anwendung läuft oder wird nicht unterstützt, Microsoft Sans Serif wird ersetzt werden.
Das Ergebnis dieser Erkenntnis:
private bool IsFontInstalled(string fontName) {
using (var testFont = new Font(fontName, 8)) {
return 0 == string.Compare(
fontName,
testFont.Name,
StringComparison.InvariantCultureIgnoreCase);
}
}
Andere Antworten vorgeschlagen Font
Erstellung mit nur funktionieren, wenn der FontStyle.Regular
verfügbar ist. Einige Schriften, zum Beispiel Verlag Bold, haben keinen regelmäßigen Stil. Schöpfung würde mit Ausnahme fehlschlagen Font 'Verlag Bold' nicht unterstützt Stil 'Regular' . Sie müssen für Stile überprüfen, die Ihre Anwendung benötigen. Eine Lösung folgt:
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;
}
abgehend von GVS Antwort:
private static bool IsFontInstalled(string fontName)
{
using (var testFont = new Font(fontName, 8))
return fontName.Equals(testFont.Name, StringComparison.InvariantCultureIgnoreCase);
}
Hier ist, wie ich es tun würde:
private static bool IsFontInstalled(string name)
{
using (InstalledFontCollection fontsCollection = new InstalledFontCollection())
{
return fontsCollection.Families
.Any(x => x.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase));
}
}
Eine Sache, mit dieser zu beachten ist, dass die Name
Eigenschaft ist nicht immer das, was Sie von der Suche in C erwarten würden: \ WINDOWS \ Fonts. Zum Beispiel habe ich eine Schrift namens „Arabisch-Satzs Regular“ installiert. IsFontInstalled("Arabic Typesetting Regular")
wird return false, aber IsFontInstalled("Arabic Typesetting")
gibt true zurück. ( "Arabisch Satz" ist der Name der Schriftart in Windows' Font Vorschau Tool.)
Soweit Ressourcen gehen, lief ich einen Test, wo ich diese Methode mehrfach aufgerufen, und der Test in nur wenigen Millisekunden jedes Mal beendet. Meine Maschine ist ein bisschen überwältigt, aber wenn Sie diese Abfrage bräuchten laufen sehr häufig scheint es, die Leistung sehr gut ist (und selbst wenn Sie getan haben, das ist, was Caching ist für).