Teste si une police est installée

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

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

Comment obtenez-vous une liste de toutes les fonts 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érer les fonts installées

Grâce à Jeff, je vais mieux lire la documentation de la classe Font:

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

Le résultat de cette connaissance:

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

Les autres réponses proposées à l’aide de la création de Font ne fonctionnent que si FontStyle.Regular est disponible. Certaines fonts, par exemple Verlag Bold, n’ont pas de style régulier. La création échoue avec une exception La police ‘Verlag Bold’ ne prend pas en charge le style ‘Regular’ . Vous devrez vérifier les styles requirejs par votre application. Une solution suit:

  public static bool IsFontInstalled(ssortingng 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(ssortingng fontName, FontStyle style) { bool installed = false; const float emSize = 8.0f; try { using (var testFont = new Font(fontName, emSize, style)) { installed = (0 == ssortingng.Compare(fontName, testFont.Name, SsortingngComparison.InvariantCultureIgnoreCase)); } } catch { } return installed; } 

Sortir de la réponse de GvS:

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

Voici comment je le ferais:

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

Une chose à noter est que la propriété Name n’est pas toujours ce que vous attendez de C: \ WINDOWS \ Fonts. Par exemple, j’ai une police installée appelée “Arabic Typsetting Regular”. IsFontInstalled("Arabic Typesetting Regular") renverra false, mais IsFontInstalled("Arabic Typesetting") retournera true. (“Composition arabe” est le nom de la police dans l’outil de prévisualisation des fonts de Windows.)

En ce qui concerne les ressources, j’ai effectué un test où j’ai appelé cette méthode plusieurs fois et le test s’est terminé en quelques millisecondes à chaque fois. Ma machine est un peu surpuissante, mais à moins que vous n’ayez besoin de lancer cette requête très fréquemment, il semble que les performances sont très bonnes (et même si vous le faisiez, c’est ce à quoi la mise en cache est destinée).