控制項的位置和版面配置 (Windows Forms .NET)

Windows Forms 中的控制項放置不僅由 控制項決定,而且是由控制項的父代決定。 本文說明控制項所提供的不同設定,以及影響配置的不同父容器類型。

重要

.NET 7 和 .NET 6 的桌面指南檔正在建置中。

固定位置與大小

控制項出現在父項上的位置取決於相對於父介面左上角的屬性值 Location 。 父代中的左上方位置座標為 (x0,y0) 。 控制項的大小取決於 屬性, Size 並代表控制項的寬度和高度。

Location of the control relative to the container

當控制項新增至強制自動放置的父系時,控制項的位置和大小就會變更。 在此情況下,控制項的位置和大小可能無法根據父系的類型手動調整。

MaximumSizeMinimumSize 屬性有助於設定控制項可以使用的最小和最大空間。

邊界和邊框間距

有兩個控制項屬性可協助精確放置控制項: MarginPadding

Margin 屬性可定義控制項周圍的空間,使其他控制項與該控制項的邊框保持指定的距離。

Padding 屬性可定義控制項的內部空間,使控制項的內容 (例如,其 Text 屬性值) 與控制項的邊框保持指定的距離。

下圖顯示 Margin 控制項上的 和 Padding 屬性。

Padding and Margin properties for Windows Forms Controls

當您定位和調整控制項大小時,Visual Studio 設計工具會遵守這些屬性。 對齊線會顯示為輔助線,以協助您維持在控制項的指定邊界之外。 例如,當您將控制項拖曳到另一個控制項旁邊時,Visual Studio 會顯示貼齊線:

Animated image demonstrating the snaplines with margin properties for Windows Forms .NET in Visual Studio

自動放置和大小

控制項可以自動放置在其父系內。 有些父容器會強制放置,而另一些容器則採用引導放置的控制設定。 控制項上有兩個屬性可協助自動放置和大小在父代內: DockAnchor

繪圖順序可能會影響自動放置。 控制項在父 Controls 系集合中由控制項的索引所決定的順序。 這個索引稱為 Z-order 。 每個控制項都會以集合中顯示的反向順序繪製。 也就是說,集合是第一個以最後一個繪製和最後一個繪製集合。

MinimumSizeMaximumSize 屬性有助於設定控制項可以使用的最小和最大空間。

固定

屬性會 Dock 設定控制項的框線會對齊父系的對應側邊,以及控制項在父系中調整大小的方式。

Windows form with buttons with dock settings.

當控制項停駐時,容器會決定它應該佔用和調整大小的空間,並放置控制項。 控制項的寬度和高度仍會根據停駐樣式來遵守。 例如,如果控制項停駐在頂端,則會遵守 控制項的 , HeightWidth 會自動調整 。 如果控制項停駐在左邊,則會遵守 控制項的 , WidthHeight 會自動調整 。

Location控制項的 無法手動設定為停駐控制項自動控制其位置。

Z-order控制項的 會影響停駐。 當停駐控制項配置時,它們會使用可用的空間。 例如,如果控制項先繪製並停駐到頂端,則會佔用容器的整個寬度。 如果下一個控制項停駐在左邊,則其垂直空間較少。

Windows form with buttons docked to the left and top with top being bigger.

如果控制項反轉,停駐在左邊的 Z-order 控制項現在有更多的初始空間可用。 控制項會使用容器的整個高度。 停駐在頂端的控制項,其水準空間較少。

Windows form with buttons docked to the left and top with left being bigger.

當容器成長和縮小時,停駐到容器的控制項會重新置放並調整大小,以維持其適用的位置和大小。

Animation showing how A Windows Form with buttons docked in all positions is resized.

如果多個控制項停駐在容器的同一端,則會根據其 Z-order 堆疊。

Windows form with two buttons docked to the left.

錨點

錨定控制項可讓您將控制項系結至父容器的一或多個側邊。 當容器大小變更時,任何子控制項都會維持其與錨定端的距離。

控制項可以錨定到一或多個側邊,而不受限制。 錨點是使用 屬性設定的 Anchor

Animation showing how A Windows Form with buttons anchored in all positions is resized.

自動調整大小

屬性 AutoSize 可讓控制項視需要變更其大小,以符合 屬性所 PreferredSize 指定的大小。 您可以藉由設定 AutoSizeMode 屬性來調整特定控制項的大小調整行為。

只有某些控制項支援 AutoSize 屬性。 此外,某些支援 屬性的 AutoSize 控制項也支援 AutoSizeMode 屬性。

一律為 true 行為 描述
自動調整大小是執行時間功能。 這表示它永遠不會成長或縮小控制項,然後沒有進一步的效果。
如果控制項變更大小,其 Location 屬性的值一律會維持不變。 當控制項的內容導致它成長時,控制項會向右和向下成長。 控制項不會向左成長。
DocktrueAutoSize ,會接受 和 Anchor 屬性。 控制項 Location 的 屬性值會調整為正確的值。

控制項 Label 是此規則的例外狀況。 當您將停駐 Label 控制項的 AutoSize 屬性值設定為 true 時, Label 控制項將不會延展。
不論其 AutoSize 屬性的值為何,控制項的 MaximumSizeMinimumSize 屬性一律都會受到接受。 MaximumSizeMinimumSize 屬性不會受到 AutoSize 屬性的影響。
預設不會設定最小大小。 這表示如果控制項設定為縮小, AutoSize 而且沒有內容,則其 Size 屬性的值是 (0x,0y) 。 在此情況下,您的控制項會縮小到某個點,而且不會立即顯示。
如果控制項未實 GetPreferredSize 作 方法,此方法 GetPreferredSize 會傳回指派給 Size 屬性的最後一個值。 這表示 將 設定 AutoSizetrue 不會有任何作用。
儲存格中的 TableLayoutPanel 控制項一律會縮小以符合儲存格,直到到達儲存格 MinimumSize 為止。 此大小會強制為大小上限。 當儲存格是資料列或資料行的一 AutoSize 部分時,就不是這種情況。

AutoSizeMode 屬性

屬性 AutoSizeMode 提供更精細的預設 AutoSize 行為控制。 屬性 AutoSizeMode 會指定控制項如何調整其內容的大小。 例如,內容可以是控制項的文字 Button 或容器的子控制項。

下列清單顯示 AutoSizeMode 值及其行為。

支援 AutoSize 屬性的控制項

下表描述控制項自動調整大小支援的層級:

控制 AutoSize 支援 AutoSizeMode 支援
Button ✔️ ✔️
CheckedListBox ✔️ ✔️
FlowLayoutPanel ✔️ ✔️
Form ✔️ ✔️
GroupBox ✔️ ✔️
Panel ✔️ ✔️
TableLayoutPanel ✔️ ✔️
CheckBox ✔️
DomainUpDown ✔️
Label ✔️
LinkLabel ✔️
MaskedTextBox ✔️
NumericUpDown ✔️
RadioButton ✔️
TextBox ✔️
TrackBar ✔️
CheckedListBox
ComboBox
DataGridView
DateTimePicker
ListBox
ListView
MaskedTextBox
MonthCalendar
ProgressBar
PropertyGrid
RichTextBox
SplitContainer
TabControl
TabPage
TreeView
WebBrowser
ScrollBar

在設計環境中自動調整大小

下表根據控制項 AutoSizeAutoSizeMode 屬性的值,在設計階段描述控制項的大小調整行為。

覆寫 屬性, SelectionRules 以判斷指定的控制項是否處於使用者可調整大小的狀態。 在下表中,「無法調整大小」只表示「可以調整大小」表示 MoveableAllSizeableMoveable

AutoSize 設定 AutoSizeMode 設定 行為
true 屬性無法使用。 使用者無法在設計階段調整控制項的大小,但下列控制項除外:

- TextBox
- MaskedTextBox
- RichTextBox
- TrackBar
true GrowAndShrink 使用者無法在設計階段調整控制項的大小。
true GrowOnly 使用者可以在設計階段調整控制項的大小。 Size設定 屬性時,使用者只能增加控制項的大小。
falseAutoSize 已隱藏 不適用。 使用者可以在設計階段調整控制項的大小。

注意

為了將生產力最大化,Visual Studio 中的 Windows Forms 設計工具會 AutoSize 遮蔽 類別的 Form 屬性。 在設計階段,無論其實際設定為何,表單的行為就 AutoSize 如同 屬性設定為 false 。 在執行時間,不會建立任何特殊的住宿,而且 AutoSize 屬性會套用為屬性設定所指定。

容器:表單

Form是 Windows Forms 的主要物件。 Windows Forms 應用程式通常會隨時顯示表單。 表單包含控制項,並遵守 Location 控制項的 和 Size 屬性,以進行手動放置。 表單也會回應 Dock 屬性以進行自動放置。

表單大部分時間都會在邊緣上擁有控制項,讓使用者調整表單大小。 控制項 Anchor 的 屬性會讓控制項隨著表單調整大小而成長和縮小。

容器:面板

控制項 Panel 與表單類似,因為它只會將控制項群組在一起。 它支援表單執行的相同手動和自動放置樣式。 如需詳細資訊,請參閱 容器:表單 一節。

面板會順暢地與父系混合,而且會切斷超出面板界限之控制項的任何區域。 如果控制項落在面板界限之外,而且 AutoScroll 設定為 true ,則會出現捲軸,而且使用者可以捲動面板。

與群組框 控制項不同,面板沒有標題和框線。

A Windows Form with a panel and group box.

上圖具有屬性設定為 BorderStyle 示範面板界限的面板。

容器:群組方塊

控制項 GroupBox 提供其他控制項的可識別群組。 一般而言,您會使用群組方塊來依函式細分表單。 例如,您可能有一個代表個人資訊的表單,而與位址相關的欄位會分組在一起。 在設計階段,可以輕鬆地將群組方塊與其自主控制項一起移動。

群組方塊支援表單執行的相同手動和自動放置樣式。 如需詳細資訊,請參閱 容器:表單 一節。 群組框也會切斷超出面板界限之控制項的任何部分。

與面板 控制項不同,群組方塊無法捲動內容並顯示捲軸。

A Windows Form with a panel and group box.

容器:流程配置

FlowLayoutPanel 控制項會以水平或垂直的流動方向來排列其內容。 您可以將控制項的內容從一個資料列包裝至下一個資料列,或從一個資料行包裝至下一個資料行。 或者,您可以用裁剪的方式,而不是包裝其內容。

您可以設定 FlowDirection 屬性的值來指定文字方向。 FlowLayoutPanel 控制項會在「由右至左 (RTL)」配置中,將其文字方向正確地反轉。 您也可以設定 WrapContents 屬性的值,指定要包裝或裁剪 FlowLayoutPanel 控制項的內容。

當您將 AutoSize 屬性設為 true 時,FlowLayoutPanel 控制項會根據其內容自動調整大小。 它也會為其子控制項提供 FlowBreak 屬性。 將 屬性的值 FlowBreak 設定為 true ,讓 FlowLayoutPanel 控制項停止在目前流程方向配置控制項,並換行至下一個資料列或資料行。

A Windows Form with two flow panel controls.

上圖有兩 FlowLayoutPanel 個 控制項, BorderStyle 屬性設定為示範控制項界限。

容器:資料表配置

TableLayoutPanel 控制項會在格線中排列其內容。 因為配置是在設計階段和執行時間完成的,所以在應用程式環境變更時可以動態變更。 這可讓面板中的控制項能夠按比例調整大小,以便回應變更,例如父控制項大小調整或文字長度變更,因為當地語系化。

任何 Windows Form 控制項都可以是 TableLayoutPanel 控制項的子系,包括 TableLayoutPanel 的其他執行個體。 這可讓您建構在執行階段適應變更的複雜配置。

您也可以在 TableLayoutPanel 控制項已完全充滿子控制項之後,控制展開的方向 (水平或垂直)。 TableLayoutPanel 控制項預設會向下加入資料列來展開。

您可以使用 和 ColumnStyles 屬性來控制資料列和資料行的大小和 RowStyles 樣式。 您可以個別設定資料列或資料行的屬性。

TableLayoutPanel 控制項會將下列屬性加入其子控制項:CellColumnRowColumnSpanRowSpan

A Windows Form with table layout control.

上圖有一個資料表, CellBorderStyle 其 屬性設定為示範每個儲存格的界限。

容器:分割容器

Windows Forms SplitContainer 控制項可以視為複合控制項;它是兩個面板,以可移動的列分隔。 將滑鼠指標移到分隔列上時,指標會變更形狀,以顯示分隔列是可移動的。

SplitContainer透過 控制項,您可以建立複雜的使用者介面;一個面板中的選取專案通常會決定另一個面板中所顯示的物件。 這種安排對於顯示和流覽資訊很有效。 擁有兩個面板可讓您匯總區域中的資訊,而列或「分隔器」可讓您輕鬆地調整面板的大小。

A Windows Form with a nested split container.

上圖具有分割容器,可建立左窗格和右窗格。 右窗格包含第二個分割容器, Orientation 並將 設定為 Vertical 。 屬性 BorderStyle 會設定為示範每個面板的界限。

容器:索引標籤控制項

會顯示 TabControl 多個索引標籤,例如筆記本中的分隔符號,或檔案櫃中一組資料夾中的標籤。 索引標籤可以包含圖片和其他控制項。 使用索引標籤控制項來產生在 Windows 作業系統中出現許多位置的多頁對話方塊種類,例如主控台和顯示內容。 此外, TabControl 可以用來建立屬性頁,用來設定一組相關的屬性。

最重要的屬性 TabControlTabPages ,其中包含個別索引標籤。 每個個別索引標籤都是 TabPage 物件。

A Windows Form with a tab control with two tab pages.