XAML 常用布局容器笔记

WPF 的界面结构由布局容器(Panel)决定,控件放在哪个容器里,它的位置和大小规则就跟着这个容器走。刚开始学的时候我习惯什么都用 Grid,后来发现分清几种容器的适用场景,XAML 会清爽很多。

1. Grid:行列网格

最常用的容器,先定义行和列,再用 Grid.RowGrid.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.ColumnSpanGrid.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。

« 返回笔记列表