C#窗体怎样实现自适应大小?使用布局控件实现窗体的自适应大小(非代码实现)C#WinForm怎样使控件随窗体大小的改变而自动适应?

在习惯了写固定大小的窗体之后总是会遇到界面显示不开的问题,在自己的电脑上运行的好好的,一跑到人家电脑上就动不动少一块显示不开。这哪能行,这以后那帮人用着用着屏幕稍微小点不就得找我调软件,你说咱总不能逼着人家换个显示器吧。

为此我可是煞费苦心,当初年少无知的我可是快要走遍互联网的大街小巷,腿都快累断了。为啥实现都那么复杂哩?

看了好多文章其实现原理几乎都是窗体打开时使用递归遍历所有控件,然后一个一个调尺寸,调位置。天哪,头都大了,就为了那么一个小小的功能给本来就臃肿的项目白白增加了一个类来实现,显得就更臃肿了。况且速度好像也不快(虽然我没测试过<( ̄ˇ ̄)/     不过这不影响我吐槽)。

为此,在一次机缘巧合的情况下,让我偶然发现了两个控件-tableLayoutPanel和flowLayoutPanel。

前者是列表布局,而后者是流布局。

我实现的窗体自适应就是通过前者——列表布局实现的,话不多说,上图!

C#窗体怎样实现自适应大小?使用布局控件实现窗体的自适应大小(非代码实现)C#WinForm怎样使控件随窗体大小的改变而自动适应?C#窗体怎样实现自适应大小?使用布局控件实现窗体的自适应大小(非代码实现)C#WinForm怎样使控件随窗体大小的改变而自动适应?

由于比较懒,这里就拿公司的Demo做示例啦,可以看到这样一个拉伸后的效果。

接下来就是具体的实现

 

1、首先拖一个tableLayoutPanel到窗体上

C#窗体怎样实现自适应大小?使用布局控件实现窗体的自适应大小(非代码实现)C#WinForm怎样使控件随窗体大小的改变而自动适应?

2、然后将其Dock属性设置为Fill,也就是中间那个区域

C#窗体怎样实现自适应大小?使用布局控件实现窗体的自适应大小(非代码实现)C#WinForm怎样使控件随窗体大小的改变而自动适应?

3、选择控件右上角的小三角,编辑行和列,可以在弹出的窗体中设置百分比

C#窗体怎样实现自适应大小?使用布局控件实现窗体的自适应大小(非代码实现)C#WinForm怎样使控件随窗体大小的改变而自动适应?

4、然后就可以像列表中拖其他控件啦,这时候拖到上面的控件会出现行列坐标和跨度几个属性,我这里让控件在第2行,第1列的位置,行列跨度都是2。需要注意的是同样要设置Dock属性为Fill,这样才可以填满单元格。

C#窗体怎样实现自适应大小?使用布局控件实现窗体的自适应大小(非代码实现)C#WinForm怎样使控件随窗体大小的改变而自动适应?

5、如果不想要填满,也可以设置它的anchor属性,让它居中对齐

C#窗体怎样实现自适应大小?使用布局控件实现窗体的自适应大小(非代码实现)C#WinForm怎样使控件随窗体大小的改变而自动适应?

6、这样就实现了控件随窗体大小变化而变化的功能,如果需要自适应屏幕大小,就可以在窗体打开事件中加上下面这段代码。

C#窗体怎样实现自适应大小?使用布局控件实现窗体的自适应大小(非代码实现)C#WinForm怎样使控件随窗体大小的改变而自动适应?

 这样只需要调整主界面的大小,让主界面调整为屏幕大小,它下面的控件就会按照比例进行缩放。

最后,有两点要注意的地方就是:

1、像我示范的窗体那样有很多groupBox控件的话,是需要用相同的办法在groupBox控件中也加入布局控件进行上面相同的操作,否则就会出现groupBox缩小了,但是groupBox里面的子控件却被覆盖掉而显示不出来了的这种情况。

2、如果想要实现局部放大或缩小,也就是有些地方不希望它改变大小,只希望固定控件去改变大小,如图

C#窗体怎样实现自适应大小?使用布局控件实现窗体的自适应大小(非代码实现)C#WinForm怎样使控件随窗体大小的改变而自动适应?C#窗体怎样实现自适应大小?使用布局控件实现窗体的自适应大小(非代码实现)C#WinForm怎样使控件随窗体大小的改变而自动适应?

 这种情况下只需要前面几行固定像素,让希望变化的控件为百分比大小即可,就像这样

C#窗体怎样实现自适应大小?使用布局控件实现窗体的自适应大小(非代码实现)C#WinForm怎样使控件随窗体大小的改变而自动适应?

这样,C#窗体就可以随意的拖拉拽,而不用写死大小了,更不用担心放到别人电脑上显示不开的情况了。