Frage

Gibt es eine einfache Art und Weise (in .NET) zu testen, ob eine Schriftart auf dem aktuellen Computer installiert ist?

War es hilfreich?

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 .

MSDN:
Aufzählen installierten Schriftarten

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top