此问题也是无意间发现的,一直做的是.NET Web应用程序,在处理一些繁琐,重复的工作的时候就想写个小工具出来提升工作效率,wpf学过,不精通,winform花了2天时间把所有控件看了一遍,于是动手开始实现,Core的代码好写,UI部分简单点,就去拖几个控件,做一下布局吧。
谈到布局,winform给我提供了以下几种:
FlowLayoutPanel:就是流式布局,做过web的同学都知道文档流,跟那个类似,在这个布局下,控件的相对位置需通过其Size, Padding, Margin属性来做定位。
GroupBox:没啥说的,就是个框框,写个标题
Panel:这个布局下,控件的位置需要通过其Size和Location做定位
SplitContainer:有分隔条的双面板,其实就是放了2个panel+1个鼠标拖动事件,不过样子长的实在是丑,不满意的同学可以自己实现1个这样的容器
TabControl:标签页,中间也是Panel,具体定位见Panel
TableLayoutPanel:表格布局,这个布局下你可以写类似于table那种方式,设置行高,列宽,把自己的控件放在单元格中,可以写行合并(ROWSpan),列合并(ColSpan),简单就不说了。
做布局的话还要2个属性是必须知道的:Dock & Anchor
Dock:停靠,你可以把你的控件停靠在父容器的1个位置,其值为枚举类型,如下:
1 public enum DockStyle 2 { 3 None = 0, 4 Top = 1, 5 Bottom = 2, 6 Left = 3, 7 Right = 4, 8 Fill = 5 9 }
注意:添加控件的方法是Controls.Add(Inherits from Control),如:
1 this.Controls.Add(this.splitContainer1); 2 this.Controls.Add(this.menuStrip1); 3 this.Controls.Add(this.statusStrip1);
我这3个被添加的控件都设置了dock属性,menu是Dock.Top,Status是Dock.Bottom,splitContainer是Dock.Fill,将控件添加到父容器中,对于设置了Dock属性的控件有1个显示的优先级,越靠后添加的控件,其最先在父容器中占位置,本例中先给statusStrip分配位置,其次是menuStrip,最后是splitContainer,如果你不小心先添加了menuStrip,再添加splitContainer,那么你的splitContainer将覆盖住menuStrip,splitContainer的Location和Size属性怎么调都无效,因为其布局是Dock.Fill,因此当你手写布局的时候一定要记得你添加的这些控件应该占据的位置,并合理在代码中添加它的先后顺序。永远记住:越靠后添加的控件将越先占据位置(在Dock属性下)。
Anchor:锚点,简单理解为将你的控件4个角订上钉子,当它所在的父容器变化时,会先去看下是在这个控件的哪个方向钉住的,如果是Left,那么这个控件将与父容器的左边线距离始终不变,同理可知其他3个设置,也可以设置多个,比如设置left, top,比如设置left, right,这样的话该控件就会缩放,以与父容器的左右边线距离不变,以此类推。
参考博文:winform一二三四事,未完结系列
<完>