WPF Grid行间距问题:实现Label紧贴下方ListBox控件
WPF Expander内嵌Grid实现Label紧贴ListBox布局方案
问题根源
两个异常现象的核心原因是Grid行配置规则、WPF面板Z序规则不符合预期:
- 未显式设置高度的
RowDefinition默认采用*(比例分配)模式,你当前定义了3个等权重的*行,Grid会把可用高度三等分,Label仅占第一行的内容高度,第一行剩余空间、整个第三行都会留空,自然出现均匀的空白间隙。 - 移除所有行定义后,Grid所有子元素默认放置在第0行第0列;WPF面板的子元素渲染层级规则是后声明的控件覆盖在先声明控件之上,和书写顺序的层级认知相反,因此后写的ListBox会铺满整个Grid区域,遮挡前面的Label。
修正后的实现代码
仅保留2个行定义即可:第一行设置Height="Auto"让高度完全适配Label内容,不产生多余空隙;第二行设置Height="*"占满剩余所有可用空间分配给ListBox,删除多余的第三行定义:
<Expander HorizontalAlignment="Left" Height="434" Header="Expander" ExpandDirection="Left" Margin="651,8,0,8"> <Grid Background="#FF252525" ShowGridLines="True"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Label Content="Video Sources" Grid.Row="0"/> <ListBox Grid.Row="1" d:ItemsSource="{d:SampleData}"> </ListBox> </Grid> </Expander>
调整提示
如果需要控制Label和ListBox之间的间距,直接给Label设置Margin="0,0,0,数值"或者给ListBox设置Margin="0,数值,0,0"即可,不需要额外加空行占位。单列表场景下不需要换用ListView,该方案更轻量。
内容的提问来源于stack exchange,提问作者Meme Machine
相关产品推荐
相关产品推荐

