XAML 常用布局容器笔记
WPF 的界面结构由布局容器(Panel)决定,控件放在哪个容器里,它的位置和大小规则就跟着这个容器走。刚开始学的时候我习惯什么都用 Grid,后来发现分清几种容器的适用场景,XAML 会清爽很多。
1. Grid:行列网格
最常用的容器,先定义行和列,再用 Grid.Row、Grid.Column 把子元素放进对应格子。列宽支持三种写法:固定值、Auto(按内容)、*(按比例分配剩余空间)。
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="用户名" />
<TextBox Grid.Row="0" Grid.Column="1" />
</Grid>
要点记录:
- 不写
Grid.Row/Grid.Column时默认是第 0 行第 0 列,多个元素会重叠在一起。 2*和1*表示按 2:1 分配剩余宽度,而不是绝对像素。- 需要跨格子时用
Grid.ColumnSpan或Grid.RowSpan。
2. StackPanel:单方向堆叠
按 Orientation 指定的方向依次排列子元素,默认是 Vertical。适合表单里一行行往下排的场景,或者按钮组横向排列。
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
<Button Content="确定" Width="80" Margin="0,0,8,0" />
<Button Content="取消" Width="80" />
</StackPanel>
注意点:竖向 StackPanel 里子元素的 Height 由自身内容决定,给它设 VerticalAlignment="Stretch" 是没有效果的,这一点当时卡了我一会儿。
3. DockPanel:停靠布局
通过 DockPanel.Dock 把子元素停靠到上、下、左、右四个边,最后一个子元素默认填满剩余区域(由 LastChildFill 控制)。做“顶部工具栏 + 底部状态栏 + 中间内容区”这种经典窗口结构很顺手。
<DockPanel>
<ToolBarTray DockPanel.Dock="Top" />
<StatusBar DockPanel.Dock="Bottom" />
<ContentControl /> <!-- 自动填满中间 -->
</DockPanel>
4. WrapPanel:自动换行排列
子元素依次排列,一行放不下就自动换到下一行,类似网页里的浮动流式布局。适合标签、缩略图这类数量不固定的内容。缺点是不能像 Grid 那样对齐列,做表格类界面不合适。
小结
- 结构规整、需要对齐 → Grid
- 一行行或一列列顺序排 → StackPanel
- 窗口整体框架、边缘停靠 → DockPanel
- 数量不定、需要自动换行 → WrapPanel
另外一个经验是:布局嵌套层级越深,界面渲染和后期维护成本都会上升,能用一个 Grid 定好行列的地方,就不要再套三四层 StackPanel。