2008-09-22 3 views

ответ

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

Это работает только в том случае, если доступен стандартный стиль шрифта – 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 
} 

См InstalledFontCollection class подробности.

MSDN:
Enumerating Installed Fonts

+3

Это самый «прямой» способ для меня, другие предлагаемые ответы больше похожи на обходные пути. –

+0

@UgurTuran: Да, однако мне интересно о производительности? Не знал бы, пока не попытался, но кишка говорит, что другие быстрее из-за возможности иметь таблицы поиска. – Hans

12

Благодаря Джефф, я лучше читать документацию класса Font:

Если параметр FamilyName определяет шрифт, который не установлен на машине, на которой запущено приложение или не поддерживается, Microsoft Sans Сериф будет заменен.

В результате этого знания:

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

Очевидно, что этот конструктор шрифтов предполагает FontStyle.Regular ... он работает только в том случае, если доступен стандартный стиль шрифта – jltrem

2

Уходя ответа GvS»:

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

Другие ответы предложили использовать Font создание работать только если FontStyle.Regular доступен. Некоторые шрифты, например, Verlag Bold, не имеют обычного стиля. Создание завершится с ошибкой Font 'Verlag Bold' не поддерживает стиль 'Regular'. Вам нужно будет проверить стили, которые потребуются вашему приложению. Решение следующее:

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

Вот как я бы это сделать:

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

Одна вещь, чтобы отметить с этим, что Name свойство не всегда то, что можно было бы ожидать от поиска в C: \ WINDOWS \ Fonts. Например, у меня установлен шрифт, называемый «Арабский типсеттинг». IsFontInstalled("Arabic Typesetting Regular") вернет false, но IsFontInstalled("Arabic Typesetting") вернет true. («Арабский набор шрифтов» - это имя шрифта в средстве предварительного просмотра шрифтов Windows.)

Что касается ресурсов, я провел тест, где несколько раз вызывал этот метод, и тест заканчивался всего за несколько миллисекунд каждый раз. Моя машина немного перегружена, но, если вам не нужно будет запускать этот запрос очень часто, кажется, что производительность очень хорошая (и даже если вы это сделали, для этого используется кэширование).

Смежные вопросы