Dock – Windows Form 畫面配置魔術師(1)

對於常寫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,會得到一個長的像這樣的畫面:

Dock01 對照左側的圖與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)

 

    得到一個不是太直覺的結果:

Dock02 左圖顯示了事實上越晚拖拉進來的控制項,它的加入順序是越前面,但它的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)越高,千萬別問我為什麼數字小的卻被稱為『高』,因為我也是就文件說明內容和實驗結果驗證推論的。

       因為看起來文章有點太長,所以先把疊置順序前半部寫完,後半部與尺寸的部份留待下一篇再來說明。