C # FontFamily не показывает новые шрифты

#c# #windows #fonts #custom-controls

#c# #Windows #шрифты #пользовательские элементы управления

Вопрос:

Я замечаю, что когда мы пытаемся перечислить шрифты с помощью C #, это работает нормально; однако, если мы хотим установить новый шрифт во время работы приложения, вызов перечисления шрифтов не возвращает новый шрифт, пока приложение не будет перезапущено.

Вот код:

 public void Populate(bool b)
{
    both = b;
    foreach (FontFamily ff in FontFamily.Families)
    {
        if(ff.IsStyleAvailable(FontStyle.Regular))
            Items.Add(ff.Name);                                             
    }           
}
 

Примечания к вышеуказанному методу:
Items.Add() добавляет элементы в a comboBox .

Должно быть, я что-то неправильно понимаю. Как я могу заставить приведенный выше код запрашивать систему для шрифтов, даже новых?

Комментарии:

1. вы пытались вспомнить свой метод заполнения после установки нового шрифта на вашем компьютере? поскольку проблема в том, что приложение уже запущено, и заполнение шрифтов уже выполнено до установки новых шрифтов. Сделайте что-нибудь, чтобы обновить кнопку обновления, чтобы обновить список шрифтов в вашем выпадающем списке.

Ответ №1:

Вы пробовали с

 using System.Drawing.Text;
InstalledFontCollection fonts = new InstalledFontCollection();
foreach (FontFamily ff in fonts.Families)
{
    if (ff.IsStyleAvailable(FontStyle.Regular))
        Items.Add(ff.Name);
}
 

Комментарии:

1. так что что-то вроде var installed = new InstalledFontCollection(); foreach (FontFamily ff in installed.Families) должно это сделать. я попробую, спасибо за направление.

2. Это выглядит не совсем правильно. Вы не используете переменную fonts.

3. LarsTech, я исправил это для @Marco. Просто простая опечатка.

4. К сожалению, это не сработало; Мы открыли программу, она запустилась populate без проблем, и мы добавили новый шрифт через Windows (щелкнули по нему правой кнопкой мыши -> установить), а затем снова запустили populate, и он его не обнаружил. Мы перезапустили приложение, и оно обнаружилось нормально. Все та же проблема, похоже, что она не будет обнаружена, пока приложение не будет перезапущено.

5. @zackrspv: это старое обсуждение , но, согласно этому, это проблема ОС. Может быть, они еще не исправили это?

Ответ №2:

 public void Populate(bool b)
{
    both = b;
    InstalledFontCollection fonts = new InstalledFontCollection();
    foreach (FontFamily ff in fonts.Families)
    {
        if (ff.IsStyleAvailable(FontStyle.Regular))
            Items.Add(ff.Name);
    }

}
 

Комментарии:

1. Хм, это кажется совершенно равным моему ответу 😉