流式布局原理
WPF采用流式布局模型,允许元素动态调整尺寸并自动推挤相邻元素。核心机制体现在容器对布局的绝对控制权,开发者应避免显式设置控件尺寸和坐标。
布局生命周期
双阶段布局流程包含:
- 测量阶段:容器递归计算子元素的理想尺寸
- 排列阶段:根据可用空间和优先级确定元素实际位置
当容器空间不足时,需通过设置MinWidth/MinHeight确保内容可见性。
布局容器体系
所有容器继承自Panel抽象类,核心属性包括:
| Background | 触发鼠标事件的基础条件 |
| Children | 直接子元素集合 |
| IsItemsHost | 标识是否为ItemsControl的数据容器 |
常用容器特性
- StackPanel:单向堆叠布局,支持Horizontal/Vertical方向切换
- WrapPanel:自动换行布局,默认水平方向排列
- DockPanel:锚定布局,通过Dock附加属性指定停靠方向
- Grid:网格布局,支持行列定义和跨单元格合并
布局属性体系
FrameworkElement定义的布局属性:
| HorizontalAlignment | 水平对齐方式 |
| VerticalAlignment | 垂直对齐方式 |
| Margin | 外边距控制 |
| Min/MaxWidth | 尺寸限制范围 |
Border装饰器
非布局容器但常配合使用,示例:
<Border Margin="5" Background="LightYellow"
BorderBrush="SteelBlue" BorderThickness="3"
CornerRadius="5" Padding="5">
<StackPanel>
<Button Content="提交" Margin="3"/>
<Button Content="取消" Margin="3"/>
</StackPanel>
</Border>
Grid高级用法
行列定义支持三种模式:
- 绝对值:Width="100"
- 自动调整:Width="Auto"
- 比例分配:Width="2*"
跨单元格示例:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.ColumnSpan="2" Text="输入内容"/>
<TextBox Grid.Row="1" Grid.Column="0"/>
<Button Grid.Row="1" Grid.Column="1" Content="确认"/>
</Grid>
动态分割布局
GridSplitter使用规范:
- 单独分配行列用于分割器
- 通过RowSpan/ColumnSpan扩展作用范围
- 设置固定尺寸和拉伸对齐
示例代码:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition MinWidth="150"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition MinWidth="100"/>
</Grid.ColumnDefinitions>
<GridSplitter Grid.Column="1" Width="8"
HorizontalAlignment="Center"
VerticalAlignment="Stretch"/>
<TextBox Grid.Column="0" Text="左侧内容"/>
<TextBox Grid.Column="2" Text="右侧内容"/>
</Grid>