此問題也是無意間發現的,一直做的是.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一二三四事,未完結系列
<完>