XAML中Grid宽度不足时如何指定优先收缩的列
解决方案
你不需要手动计算各列宽度,修改列宽的配置逻辑即可实现需求,修改后的XAML代码如下:
<Grid MaxWidth="150" HorizontalAlignment="Left"> <Grid.ColumnDefinitions> <!-- 可换行内容所在列设为*,分配Auto列占用后剩余的可用宽度 --> <ColumnDefinition Width="1*" /> <!-- 不可换行内容所在列保留Auto,优先占用自身实际需要的宽度,不会被压缩 --> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <TextBlock Grid.Column="0" Text="I'm long but I wrap" TextWrapping="Wrap" Background="LightGreen" /> <TextBlock Grid.Column="1" Text="I'm a long single line" TextWrapping="NoWrap" Background="LightSteelBlue" /> </Grid>
实现逻辑说明
- 布局计算时Grid会优先计算所有
Auto列的实际宽度,不可换行的内容会完整展示,不会被压缩 - 剩余的可用宽度会分配给设置为
*的列,列内的换行文本会自动适配宽度触发折行 - 因为Grid设置了
HorizontalAlignment="Left",当所有列的内容总宽度小于MaxWidth时,Grid会自动收缩到刚好包裹内容的尺寸,不会占用多余空白,完全满足你不希望额外占空间的要求
如果存在多个可换行列,只需要给对应列都设置*宽度,即可按比例分配剩余可用宽度,不需要额外写后台逻辑计算。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

