2008-09-22 9 views

Respuesta

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

esto solo funciona si el estilo de fuente 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 
} 

Ver InstalledFontCollection class para más detalles.

MSDN:
Enumerating Installed Fonts

+3

Esta es la forma más "directa" para mí, otras respuestas propuestas parecen más como soluciones temporales. –

+0

@UgurTuran: Sí, ¿pero me pregunto sobre el rendimiento? No lo sabría hasta que lo intentara, pero el instinto dice que los otros son más rápidos debido a la oportunidad de tener búsquedas en la tabla. – Hans

12

Gracias a Jeff, tengo mejor que lea la documentación de la clase de letra:

Si el parámetro familyName especifica una fuente que no está instalada en el equipo que ejecuta la aplicación o no es compatible, se sustituirá Microsoft Sans Serif.

El resultado de este conocimiento:

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

Evidentemente este constructor de Fuente asume FontStyle.Regular ... solo funciona si el estilo de fuente Regular está disponible – jltrem

2

ir fuera de la respuesta de GVS:

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

Otras respuestas propusieron utilizar Font creación sólo funcionan si el FontStyle.Regular está disponible. Algunas fuentes, por ejemplo, Verlag Bold, no tienen un estilo regular. La creación fallaría con la excepción La fuente 'Verlag Bold' no es compatible con el estilo 'Regular'. Deberá verificar los estilos que su aplicación requerirá. Una solución de la siguiente manera:

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

Así es como yo lo haría:

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

Una cosa a destacar con esto es que la propiedad Name no siempre es lo que se espera de buscar en C: \ WINDOWS \ Fuentes. Por ejemplo, tengo una fuente instalada llamada "Arabic Typsetting Regular". IsFontInstalled("Arabic Typesetting Regular") devolverá falso, pero IsFontInstalled("Arabic Typesetting") devolverá verdadero. ("Tipografía árabe" es el nombre de la fuente en la herramienta de vista previa de fuentes de Windows.)

En lo que respecta a los recursos, realicé una prueba donde llamé a este método varias veces, y la prueba terminó en solo unos pocos milisegundos cada vez. Mi máquina está un poco sobrecargada, pero a menos que necesites ejecutar esta consulta con mucha frecuencia, parece que el rendimiento es muy bueno (e incluso si lo hiciste, para eso sirve el almacenamiento en caché).

Cuestiones relacionadas