Grid 是 WPF 最強大、最常用的佈局容器。本文深入剖析列寬定義模式、跨列/跨行、Z-Index 堆疊、共享尺寸組解決多 Grid 對齊難題,並解析附加屬性機制。
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50" /> <!-- 1. 固定像素 -->
<ColumnDefinition Width="Auto" /> <!-- 2. 自動適應內容 -->
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="2*" /> <!-- 3. 比例分配 (2份) -->
<ColumnDefinition Width="*" /> <!-- 3. 比例分配 (1份) -->
</Grid.ColumnDefinitions>
| 模式 | 語法 | 行為 | 注意 |
|---|---|---|---|
| 固定 | 50, 100.5 | 絕對像素,不足則裁剪 | 單位為裝置無關像素 (1/96 inch) |
| 自動 | Auto | 根據該列/行中**最大**子元素 DesiredSize | 內容為空則寬度為 0 |
| 比例 | *, 2*, 0.5* | 扣除固定/自動後剩餘空間按權重分配 | * 等同 1*;2*:* = 2:1 |
子元素透過 Grid.Row, Grid.Column, Grid.RowSpan, Grid.ColumnSpan 指定位置 — 這是 **附加屬性** 經典應用:
定義在父容器 (Grid),賦值在子元素 (Button 等)。
<Button Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2">A</Button> <!-- 跨兩列 -->
<Button Grid.Row="1" Grid.Column="0" Grid.RowSpan="2">D</Button> <!-- 跨兩行 -->
標題列 Grid + 資料列 Grid (含 ScrollViewer)。滾動時標題固定,但兩 Grid 列寬不同步導致欄位錯位。
<DockPanel Grid.IsSharedSizeScope="True"> <!-- 1. 定義共享作用域 -->
<!-- 標題 Grid -->
<Grid DockPanel.Dock="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" SharedSizeGroup="Location" />
<ColumnDefinition Width="Auto" SharedSizeGroup="Rank" />
<ColumnDefinition Width="Auto" /> <!-- 滾動條佔位 -->
</Grid.ColumnDefinitions>
<Border Grid.Column="2" Grid.ColumnSpan="2" ...><TextBlock>Rank</TextBlock></Border>
<FrameworkElement Grid.Column="3" Width="{DynamicResource {x:Static SystemParameters.ScrollWidthKey}}" />
</Grid>
<!-- 資料 Grid (在 ScrollViewer 內) -->
<ScrollViewer>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" SharedSizeGroup="Location" />
<ColumnDefinition Width="Auto" SharedSizeGroup="Rank" />
</Grid.ColumnDefinitions>
<!-- 資料行 -->
</Grid>
</ScrollViewer>
</DockPanel>
Grid.IsSharedSizeScope="True":在共同祖先 (DockPanel) 開啟共享作用域,**隔離外部同名群組**。SharedSizeGroup="Location":同群組的所有 Auto 列/行,**取最大 DesiredSize** 統一寬高。Width="{DynamicResource {x:Static SystemParameters.ScrollWidthKey}}" 動態獲取系統滾動條寬度。ResizeBehavior 設定正確。Grid 看似簡單,實則蘊含「約束求解器」般的佈局智慧,精通其機制是 WPF 佈局大師的必修課。