Pergunta

Existe uma maneira fácil (em .net) para testar se uma fonte é instalado na máquina atual?

Foi útil?

Solução

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

Outras dicas

Como você recebe uma lista de todas as fontes instaladas?

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

Consulte InstalledFontCollection classe para detalhes .

MSDN:
enumerar fontes instaladas

Graças a Jeff, eu li melhor a documentação da classe Font:

Se o parâmetro familyName especifica uma fonte que não está instalado na máquina executando o aplicativo ou não é suportado, Microsoft Sans Serif será substituído.

O resultado deste conhecimento:

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

Outras respostas proposto usando a criação Font só funcionam se o FontStyle.Regular está disponível. Algumas fontes, por exemplo Verlag Negrito, não tem um estilo regular. Criação falharia com exceção Fonte 'Verlag Negrito' não suporta estilo 'regular' . Você precisa verificar se há estilos que sua aplicação vai exigir. A solução seguinte:

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

Saindo de resposta GVS':

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

Aqui está como eu faria isso:

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

Uma coisa a nota com este é que a propriedade Name nem sempre é o que você esperaria de olhar em C: \ WINDOWS \ Fonts. Por exemplo, eu tenho uma fonte instalada chamado de "árabe Typsetting Regular". IsFontInstalled("Arabic Typesetting Regular") retornará falso, mas IsFontInstalled("Arabic Typesetting") retornará verdadeiro. ( "Árabe Typesetting" é o nome da fonte na ferramenta de visualização de fontes do Windows').

Quanto aos recursos ir, eu corri um teste onde eu chamado este método várias vezes, e o teste terminou em apenas alguns milissegundos de cada vez. Minha máquina é um pouco dominado, mas a menos que você precisa para executar essa consulta muito frequentemente parece que o desempenho é muito bom (e mesmo se você fez, isso é o que o cache é para).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top