更改应用程序中所有控件的字体大小(win 窗体)

Change the font size of all controls in the application (win forms)

我有一个应用程序需要适应一系列不同的屏幕尺寸(分辨率)。 我使用 table 布局面板完成了大部分工作。

但是一些控件(主要是按钮和标签)的字体太大,文本不适合控件。 到目前为止,我已经通过使用

设法改变了一些控件的字体
            if (Screen.PrimaryScreen.Bounds.Width < 1440)
        {
            button_5.Font = new Font("Impact", button_5.Font.Size - 4);
        }

但是要为应用程序中的每个控件添加太多文本。

有没有办法一次更改应用程序上所有控件的字体? 或者至少是表单上的所有控件?

一个简单的递归函数将遍历表单中的所有控件并更改字体大小。你需要对照你的控件来测试它并查看效果,因为在这段代码中没有异常处理

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

在这两个示例中,所有字体都会受到更改的影响。您不需要知道字体系列名称,每个控件可以有不同的名称。

结合this answer you can auto-scale fonts in your application based on Windows settings (which you can find if you right click on the desktop, then select Display settings, Scale and layout and modify the value "Change the size of text, apps, and other items" - in Windows 10 versions newer than build 1809 this is (re-)named as "Make everything bigger"):

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

您还应该根据您的表单布局将大小限制在某个 maximum/minimum,例如

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

同样对于绝对值也是如此 - 请注意,在代码中已经设置了限制:实际上,字体不能小于 4 em - 这是设置为最小限制(当然你可以调整它以适应您的需求)。