Изменить размер шрифта всех элементов управления в приложении (выигрышные формы)

У меня есть приложение, которое должно быть адаптировано к различным размерам экрана (разрешению). Большую часть этого я сделал с помощью панелей макета таблицы.

Но некоторые элементы управления (в основном кнопки и метки) имеют слишком большой шрифт, и текст не помещается в элемент управления. До сих пор мне удалось изменить шрифт некоторых элементов управления с помощью

            if (Screen.PrimaryScreen.Bounds.Width < 1440)
        {
            button_5.Font = new Font("Impact", button_5.Font.Size - 4);
        }

Но это слишком много текста, чтобы добавить его к каждому элементу управления в приложении.

Есть ли способ изменить шрифты всех элементов управления в приложении одновременно? Или хотя бы все элементы управления в форме?

3 ответа

Решение

Простая рекурсивная функция обходит все элементы управления в вашей форме и изменяет размер шрифта. Вы должны проверить его на соответствие вашим элементам управления и посмотреть на эффект, потому что в этом коде нет обработки исключений

public void SetAllControlsFont(ControlCollection ctrls)
{
    foreach(Control ctrl in ctrls)
    {
        if(ctrl.Controls != null)
            SetAllControlsFont(ctrl.Controls);

        ctrl.Font = new Font("Impact", ctrl.Font.Size - 4);

    }
}

Вы можете вызвать его из формы верхнего уровня, передав контрольную коллекцию начальной формы.

SetAllControlsFont(this.Controls);

Основываясь на хорошем ответе Стива, я бы сделал следующие улучшения:

/// <summary>
/// Changes fonts of controls contained in font collection recursively. <br/>
/// <b>Usage:</b> <c><br/>
/// SetAllControlsFont(this.Controls, 20); // This makes fonts 20% bigger. <br/>
/// SetAllControlsFont(this.Controls, -4, false); // This makes fonts smaller by 4.</c>
/// </summary>
/// <param name="ctrls">Control collection containing controls</param>
/// <param name="amount">Amount to change: posive value makes it bigger, 
/// negative value smaller</param>
/// <param name="amountInPercent">True - grow / shrink in percent, 
/// False - grow / shrink absolute</param>
public static void SetAllControlsFontSize(
                   System.Windows.Forms.Control.ControlCollection ctrls,
                   int amount = 0, bool amountInPercent = true)
{
    if (amount == 0) return;
    foreach (Control ctrl in ctrls)
    {
        // recursive
        if (ctrl.Controls != null) SetAllControlsFontSize(ctrl.Controls,
                                                          amount, amountInPercent);
        if (ctrl != null)
        {
            var oldSize = ctrl.Font.Size;
            float newSize = 
               (amountInPercent) ? oldSize + oldSize * (amount / 100) : oldSize + amount;
            if (newSize < 4) newSize = 4; // don't allow less than 4
            var fontFamilyName = ctrl.Font.FontFamily.Name;
            ctrl.Font = new Font(fontFamilyName, newSize);
        };
    };
}

Это позволяет увеличивать или уменьшать размер шрифта в процентах, например:

SetAllControlsFont(this.Controls, 20); 

Или вы можете уменьшить размер шрифта абсолютно по значению -4, как:

SetAllControlsFont(this.Controls, amount: -4, amountInPercent: false); 

В обоих примерах изменение коснется всех шрифтов. Вам не нужно знать названия семейств шрифтов, каждый элемент управления может иметь разные названия.

В сочетании с этим ответом вы можете автоматически масштабировать шрифты в своем приложении на основе настроек Windows (которые можно найти, если щелкнуть правой кнопкой мыши на рабочем столе, затем выбрать Параметры отображения, Масштаб и макет и изменить значение "Изменить размер текста, приложения и другие элементы " - в версиях Windows 10 новее, чем сборка 1809, это (пере) названо как " Сделать все больше "):

var percentage = GetWindowsScaling() - 100;
SetAllControlsFont(this.Controls, percentage); 

Вы также должны ограничить размер до определенного максимума / минимума в зависимости от макета вашей формы, например

if (percentage > 80)  percentage = 80;
if (percentage < -20) percentage = -20;

Точно так же это верно для абсолютных значений - обратите внимание, что в коде уже установлен предел: практически шрифт не может быть меньше 4 em - это установлен как минимальный предел (конечно, вы можете адаптировать его к своим потребностям).

Просто установите шрифт родительской формы. Он будет распространяться через элементы управления, если вы не установите шрифт для дочернего элемента управления вручную.

Пример кода:

      public MyForm()
{
    InitializeComponent();
    Font = new Font(new FontFamily("Microsoft Sans Serif"), 8f); //replace 8f with desired font size
}

ОтControl.Font документы:

Примечания

Свойство Font является внешним свойством. Окружающее свойство — это свойство элемента управления, которое, если оно не установлено, извлекается из родительского элемента управления. Например, кнопка по умолчанию будет иметь тот же BackColor, что и ее родительская форма.

Протестировано в.NetFramework 4.6.2и.Net6

Другие вопросы по тегам