2017-07-31 90 views
1

我有一个应用程序需要适应不同屏幕尺寸(分辨率)的范围。 大部分我使用表格布局面板完成。更改应用程序中所有控件的字体大小(获胜窗体)

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

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

但是,这是太多的文字添加应用程序中的每一个控制。

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

+0

每窗体是一个控件容器,其中的控件属性列出了该窗体上的所有控件。当一个控件本身就是一个控件容器(面板,groupbox)时,它具有一个Controls集合以及由该容器托管的控件。这是相对容易的建立一个递归函数,循环你的表格的所有控制 – Steve

+0

你可能给我一个这样的功能的例子,所以我可以建立我所需要的? – Martynas

+0

我设法使用 foreach(控制Ctrl在tableLayoutPanel1.Controls中) ctrl.Font = new Font(“Impact”,ctrl.Font.Size - 4); } 但不知道如何访问整个窗体的所有控件呢。 – Martynas

回答

1

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

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

这只会更改第一个表格布局面板的字体,但不会循环控制的其余部分。 – Martynas

+0

如果_this.Controls_是Form.Controls集合,则情况不应该如此。层次结构的顶层 – Steve

+0

它可能与'this.Controls'只包含'{System.Windows.Forms.TableLayoutPanel,BorderStyle:System.Windows.Forms.BorderStyle.None}'这个事实有关,它不是'即使在窗体上的实际控制,只是控制的类型。 – Martynas