如何在Windows窗体应用程序中的所有控件中更改FontFamily属性?

时间:2015-12-16 18:24:48

标签: c# winforms fonts

我一直在这里搜索一种只更改Windows窗体应用程序中所有控件的FontFamily的方法。请注意,我不想更改它们的字体大小。

情况如下:为了促进跨Windows兼容性,然而,创建良好的用户界面,Vista之前的计算机中的FontFamily将具有一种字体(Tahoma),较新版本将与来自Google的Open Sans一起使用(Open Sans字体将随项目一起分发。)

我已成功使用 Environment.OSVersion 属性更改旧版Windows中的字体,并在Form1上创建应用程序设置(UserFont)。像这样:

private void Form1_Load(object sender, EventArgs e)
{
    if (Environment.OSVersion.Version.Major == 5)
    {
        Properties.Settings.Default.UserFont = new Font("Tahoma", 12);
    }
    else if (Environment.OSVersion.Version.Major >= 6)
    {
        Properties.Settings.Default.UserFont = new Font("Open Sans", 12);
    }
}

因此,当表单加载时,它会将所有子控件更改为Tahoma或Open Sans,但它也会将字体大小更改为12.这导致了我的问题:

如何只更改表单中所有控件的FontFamily,保持其大小和样式?

P.S。:我想为我将使用的所有字体大小创建几个应用程序设置,但我真的想要一个更简单的解决方案。

谢谢:)

1 个答案:

答案 0 :(得分:0)

我有同样的问题,我所做的就像这样简单,有几个代码行:

  • 在设计中,将Open Sans设置为主窗体/窗口的初始字体 (另外,您应该设置所有子控件以继承其父项的字体。)
  • 在代码中,首先检查操作系统版本:

    if (!IsWinVistaOrHigher) {
        this.Font = new Font("Tahoma", 12);
    }
    

    并且所有孩子都将被自动继承。如果false,则Open Sans被加载,好像什么也没发生过一样。

  • 如果只有几个控件需要修改字体,下面的示例代码可以保留原始字体大小:

    label1.Font = new Font("Tahoma", label1.Font.Size);
    label2.Font = new Font("Tahoma", label2.Font.Size);
    
  • 如果要更改许多字体大小,只需循环控制并设置字体即可。这里的关键是使用controlName.Font.Size,您可以按controlName.Font.Size - 1

  • 进行调整

为了进一步挖掘,下面的代码可能会帮助您获得更多想法:

考虑你放弃Panel / TableLayoutPanel / FlowLayoutPanel中的所有控件,然后循环可能是这样的:

foreach (Control c in FlowLayoutPanel1.Controls) {
    if (c.Controls != null) {
        c.Font = new Font("Tahoma", c.Font.Size)
    }
}

通常,循环过程可以提供帮助:

public void SetAllControlsFont(ControlCollection ctrls) {
    foreach(Control c in ctrls) {
        if(c.Controls != null) {
            SetAllControlsFont(c.Controls);
        }
        c.Font = new Font("Tahoma", c.Font.Size);
    }
}

然后通过Form1_Load()

SetAllControlsFont(this.Controls);事件中调用它

请注意,代码可能不适用于缺少转换/强制转换类型,但我希望您有一般的想法。只需在这里发表评论,我就会回来。