Проверьте, установлен ли шрифт - PullRequest
25 голосов
/ 22 сентября 2008

Есть ли простой способ (в .Net) проверить, установлен ли шрифт на текущем компьютере?

Ответы [ 6 ]

25 голосов
/ 22 сентября 2008
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
    }
}
17 голосов
/ 22 сентября 2008

Как получить список всех установленных шрифтов?

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

Подробнее см. InstalledFontCollection class .

MSDN:
Перечисление установленных шрифтов

13 голосов
/ 22 сентября 2008

Благодаря Джеффу, я лучше прочитал документацию класса 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);
        }
    }
6 голосов
/ 11 июля 2013

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

  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;
  }
2 голосов
/ 01 февраля 2013

Исходя из ответа GvS:

    private static bool IsFontInstalled(string fontName)
    {
        using (var testFont = new Font(fontName, 8))
            return fontName.Equals(testFont.Name, StringComparison.InvariantCultureIgnoreCase);
    }
1 голос
/ 25 апреля 2014

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

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. Например, у меня установлен шрифт "Arabic Typsetting Regular". IsFontInstalled("Arabic Typesetting Regular") вернет false, но IsFontInstalled("Arabic Typesetting") вернет true. («Арабский набор текста» - это название шрифта в средстве предварительного просмотра шрифтов Windows.)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...