Question

Existe-t-il un moyen simple (en .Net) de vérifier si une police est installée sur la machine actuelle?

Était-ce utile?

La solution

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

Autres conseils

Comment obtenir un liste de toutes les polices installées?

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

Voir la classe InstalledFontCollection pour plus de détails. .

MSDN:
Énumération des polices installées

Merci à Jeff, j'ai mieux lu la documentation de la classe Font:

  

Si le paramètre familyName   spécifie une police qui n'est pas installée   sur la machine qui exécute l'application   ou n'est pas pris en charge, Microsoft Sans   Serif sera remplacé.

Résultat de cette connaissance:

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

Les autres réponses proposées avec la création de Police ne fonctionnent que si le FontStyle.Regular est disponible. Certaines polices, par exemple Verlag Bold, n'ont pas de style normal. La création échouerait avec l'exception La police 'Verlag Bold' ne prend pas en charge le style 'Normal' . Vous devrez vérifier les styles requis par votre application. Une solution suit:

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

Déconnexion de la réponse de GvS:

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

Voici comment je le ferais:

private static bool IsFontInstalled(string name)
{
    using (InstalledFontCollection fontsCollection = new InstalledFontCollection())
    {
        return fontsCollection.Families
            .Any(x => x.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase));
    }
}

Il convient de noter que la propriété Name ne correspond pas toujours à ce que vous attendez de la recherche dans C: \ WINDOWS \ Fonts. Par exemple, j'ai installé une police appelée "Arabic Typsetting Regular". IsFontInstalled ("Arabic Typetting Regular") renverra false, mais IsFontInstalled ("Arabic Typeting") renverra true. ("Typographie arabe" est le nom de la police dans l'outil de prévisualisation des polices de Windows.)

En ce qui concerne les ressources, j’ai exécuté un test dans lequel j’ai appelé cette méthode à plusieurs reprises. Le test s’est terminé en quelques millisecondes à chaque fois. Ma machine est un peu surchargée, mais à moins que vous ayez besoin de lancer cette requête très fréquemment, les performances sont très bonnes (et même si vous le faisiez, la mise en cache sert à cela.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top