WPF 佈局系統核心是 **Panel** 抽象基類及其四大具體實現。本文作為第 2 章引子,速覽四大容器特性與 Grid 表格佈局語法,並介紹**附加屬性** 機制。
| 容器 | 佈局模型 | 核心屬性 | 典型場景 |
|---|---|---|---|
| DockPanel | 邊緣停靠 (WinForms Dock) | DockPanel.Dock, LastChildFill | 頁面級大區塊 (Header/ Footer/ Sidebar/ Content) |
| StackPanel | 線性堆疊 (垂直/水平) | Orientation | 表單欄位、工具列、按鈕組、簡單清單 |
| Grid | 表格行列定位 | RowDefinitions, ColumnDefinitions, 附加屬性 | **最常用**,複雜對齊、表單、儀表板、響應式佈局 |
| Canvas | 絕對座標 | Canvas.Left/Top/Right/Bottom | 繪圖、遊戲、拖放、固定版面、印刷預覽 |
<Window>
<Grid>
<Grid.RowDefinitions>
<RowDefinition /> <RowDefinition /> <RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition /> <ColumnDefinition /> <ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2">A</Button>
<Button Grid.Row="0" Grid.Column="2">C</Button>
<Button Grid.Row="1" Grid.Column="0" Grid.RowSpan="2">D</Button>
<Button Grid.Row="1" Grid.Column="1">E</Button>
<Button Grid.Row="1" Grid.Column="2">F</Button>
<Button Grid.Row="2" Grid.Column="1">H</Button>
<Button Grid.Row="2" Grid.Column="2">I</Button>
</Grid>
</Window>
<Button Width="100" Height="100">
<Button.Content>
<Grid>
<Grid.RowDefinitions>
<RowDefinition /> <RowDefinition />
</Grid.RowDefinitions>
<Image Grid.Row="0" Source="tom.png" />
<TextBlock Grid.Row="1" HorizontalAlignment="Center">Tom</TextBlock>
</Grid>
</Button.Content>
</Button>
圖片上、文字下,標準「圖文卡片」佈局。
**為何不用子元素自身屬性?**
佈局容器 (Grid/DockPanel/Canvas) 定義「槽位」,子元素 (Button/Image/TextBlock) 只需宣告「我要去哪個槽位」。
若每個控制項都自帶 `GridRow`、`Dock` 屬性,會污染控制項模型、違反單一職責。附加屬性實現 **佈局邏輯與控制項解耦** — 任意 `FrameworkElement` 皆可放入 Grid,無需修改控制項代碼。
第 2 章將深入各容器:
2.2 DockPanel、2.3 StackPanel、2.4 Grid (詳細)、2.5 Canvas、2.6 ViewBox、2.7 文字佈局、2.8 常用屬性、2.9-2.10 自定義佈局。
選對容器,佈局事半功倍 — Grid 是瑞士刀,DockPanel 是骨架,StackPanel 是堆疊,Canvas 是畫布。