對於常寫Windows Form 應用程式的人來說 [Control.Dock 屬性] 應該是一個常常會使用到的東西,這對比較有經驗的人應該不是啥太麻煩的問題,不過它很有趣,所以我想要來聊聊怎麼樣能夠順暢的使用這個屬性。
對於常寫Windows Form 應用程式的人來說 [Control.Dock 屬性] 應該是一個常常會使用到的東西,這對比較有經驗的人應該不是啥太麻煩的問題,不過它很有趣,所以我想要來聊聊怎麼樣能夠順暢的使用這個屬性。
使用這個屬性大概有三個會交互影響層面需要考慮的:
(1) 停駐型式,也就是DockSytle
(2) 在容器的疊置順序,也就是 Z-Order
(3) 尺寸的變化
停駐型式
關於DockStyle在MSDN文件庫的[DockStyle 列舉型別]中有說明其列舉內容,其中None不在本次討論之列,以下節錄自MSDN文件庫:
成員名稱 | 說明 |
None | 控制項未停駐 |
Top | 控制項的頂端邊緣停駐到其內含控制項的上方 |
Bottom | 控制項的底部邊緣停駐到其內含控制項的下方 |
Left | 控制項的左邊緣停駐到其內含控制項的左邊緣 |
Right | 控制項的右邊緣停駐到其內含控制項的右邊緣 |
Fill | 所有控制項的邊緣停駐到其內含控制項的所有邊緣,並且適當地調整大小 |
用白話文來說,停駐形式會決定控制項會靠向容器的哪一邊,下文我們會開始討論到它和其它兩樣的交互作用。
疊置順序
疊置順序(Z-Order)很重要的一件事情是疊置順序較低且其Dock屬性不為DockStyle.None的控制項會影響到疊置順序較高的控制項在Dock時所能使用的空間,MSDN 文件庫上的說明是 『當控制項停駐至其容器的邊緣時,總是在調整容器大小時對齊那個邊緣。 當有一個以上的控制項停駐在邊緣時,控制項將依據它們的疊置順序並排顯示;疊置順序中較高的控制項則遠離容器的邊緣。』這說明會讓人混亂的地方在於,倒底Z-Order怎麼決定的?壓根兒你就不會看得到Control及其衍生類別有個屬性被稱為Z-Order或是類似的名稱。
在Windows Form的程式中,Z-Order的順序其實和該控制項加入容器的順序有關,讓我們來做個實驗, 連續從工具箱拖拉四個Button控制項到畫面,而且把所有的Dock屬性都設為DockStyle.Top,會得到一個長的像這樣的畫面:
對照左側的圖與MSDN的說明,表示疊置順序由低到高的排列為 Button1, Button2, Button3, Button4 |
那究竟是誰先加入容器 (在這個範例就是指Form)?我們在這個Form的Load事件委派函式中寫下一段簡單的程式碼來測試看看:
Dim i As Int32 = 0
Dim str As String = String.Empty
For Each Con As Control In Me.Controls
str &= Con.Name & "的加入順序為" & Me.Controls.IndexOf(Con) & System.Environment.NewLine
Next
MessageBox.Show(str)
得到一個不是太直覺的結果:
左圖顯示了事實上越晚拖拉進來的控制項,它的加入順序是越前面,但它的Z-Order卻是越高。 |
觀察一下之前我所談到的Form.Designer檔案內容,會發現以下的程式碼:
Me.Controls.Add(Me.Button4)
Me.Controls.Add(Me.Button3)
Me.Controls.Add(Me.Button2)
Me.Controls.Add(Me.Button1)
沒錯,Form的Controls屬性在加入子控制項的時候的順序的確是先將Button4加入進來。所以得到一個結果是:加入順序的索引值越小者,代表它越早被加入上層容器,也代表它的疊置順序 (Z-Order)越高,千萬別問我為什麼數字小的卻被稱為『高』,因為我也是就文件說明內容和實驗結果驗證推論的。
因為看起來文章有點太長,所以先把疊置順序前半部寫完,後半部與尺寸的部份留待下一篇再來說明。