Pregunta

¿Hay una manera fácil (en .Net) para comprobar si la Fuente se instala en el equipo actual?

¿Fue útil?

Solución

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

Otros consejos

¿Cómo conseguir una lista de todas las fuentes instaladas?

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

Ver InstalledFontCollection clase para obtener más detalles.

MSDN:
La Enumeración De Las Fuentes Instaladas

Gracias a Jeff, tengo una mejor lectura de la documentación de la Fuente de la clase:

Si el apellido del parámetro especifica una fuente que no está instalada en la máquina que ejecuta la aplicación o no es compatible, Microsoft Sans Serif será sustituido.

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

Otras respuestas propuesto el uso de Font la creación de trabajo sólo si el FontStyle.Regular está disponible.Algunas fuentes, por ejemplo Verlag Negrita, no tiene un estilo regular.La creación de un error con excepción Fuente 'Verlag Negrita' no soporta el estilo de 'Regular'.Usted necesita para comprobar los estilos que su aplicación requiere.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;
  }

Va fuera de GvS' respuesta:

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

Esto es lo que yo 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 Name la propiedad no es siempre lo que usted esperaría de buscar en C:\WINDOWS\Fonts.Por ejemplo, yo tengo una fuente instalada llamado "árabe Typsetting Regular". IsFontInstalled("Arabic Typesetting Regular") devolverá false, pero IsFontInstalled("Arabic Typesetting") devolverá true.("Tipografía árabe" es el nombre de la fuente en Windows' font herramienta de vista previa.)

En cuanto a los recursos de ir, me encontré con una prueba en la que he llamado a este método varias veces, y la prueba se terminó en sólo un par de milisegundos cada vez.Mi máquina es un poco overpowered, pero a menos que usted necesitaría para ejecutar esta consulta muy a menudo parece que el rendimiento es muy bueno (e incluso si lo hizo, que es lo que el almacenamiento en caché es).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top