Tester si une police est installée
Question
Existe-t-il un moyen simple (en .Net) de vérifier si une police est installée sur la machine actuelle?
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. .
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.)