2008-09-22 7 views

Répondre

23
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 
    } 
} 
+6

cela ne fonctionne que si le style de police Regular est disponible – jltrem

15

How do you get a list of all the installed fonts?

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

Voir InstalledFontCollection class pour plus de détails.

MSDN:
Enumerating Installed Fonts

+3

C'est le moyen le plus "direct" pour moi, d'autres réponses proposées ressemblent plus à des solutions de contournement. –

+0

@Uurururan: Oui, mais je me pose des questions sur les performances? Je ne sais pas jusqu'à ce que vous avez essayé, mais gut dit que les autres sont plus rapides en raison de l'occasion pour les recherches de table. – Hans

12

Merci à Jeff, je ferais mieux de lire la documentation de la classe de la police:

Si le paramètre familyName spécifie une police qui n'est pas installé sur la machine exécutant l'application ou n'est pas supporté, Microsoft Sans Serif sera substitué.

Le 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); 
     } 
    } 
+3

Évidemment, ce constructeur de polices suppose FontStyle.Regular ... cela ne fonctionne que si le style de police Regular est disponible – jltrem

2

Allant au large de la réponse GVS:

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

Autres réponses proposées en utilisant la création Font ne fonctionnera que si le FontStyle.Regular est disponible. Certaines polices, par exemple Verlag Bold, n'ont pas de style standard. La création échouerait avec l'exception La police 'Verlag Bold' ne prend pas en charge le style 'Regular'. Vous devrez vérifier les styles que votre application exigera. Une solution suivante:

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

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

Une chose à noter avec ceci est que la propriété Name n'est pas toujours ce que vous attendez de regarder dans C: \ WINDOWS \ Fonts. Par exemple, j'ai une police installée appelée "Arabic Typsetting Regular". IsFontInstalled("Arabic Typesetting Regular") retournera faux, mais IsFontInstalled("Arabic Typesetting") retournera vrai. ("Arabic Typeetting" est le nom de la police dans l'outil d'aperçu des polices 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 seulement. à chaque fois. Mon ordinateur est un peu trop puissant, mais à moins que vous ayez besoin d'exécuter cette requête très fréquemment, il semble que la performance soit très bonne (et même si vous l'avez fait, c'est pour cela que la mise en cache est utilisée).

Questions connexes