WPF嵌套ListView宽度异常:内部ListView仅适配自身列宽
哈,这个问题我之前也碰到过!嵌套在Expander里的内部ListView总是“缩成一团”,只跟着自己的列宽走,没法撑满外层ListView的单元格宽度对吧?其实就是WPF的控件不会自动继承父容器的可用宽度,咱们改几处就能解决:
这里是调整后的完整XAML代码:
<ListView> <ListView.View> <GridView> <GridViewColumn> <GridViewColumn.CellTemplate> <DataTemplate> <Expander> <!-- 绑定宽度到父级单元格容器,抵消默认内边距 --> <ListView Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}, Path=ActualWidth}" Margin="-6" HorizontalAlignment="Stretch"> <ListView.View> <GridView> <!-- 用*让列自动填充可用宽度 --> <GridViewColumn Header="Order number" DisplayMemberBinding="{Binding Id}" Width="*"/> <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="*"/> <GridViewColumn Header="Price" DisplayMemberBinding="{Binding Price}" Width="*"/> </GridView> </ListView.View> </ListView> </Expander> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn Header="Order number" DisplayMemberBinding="{Binding OrderNumber}"/> <GridViewColumn Header="Customer" DisplayMemberBinding="{Binding Customer}"/> <GridViewColumn Header="Total Price" DisplayMemberBinding="{Binding CombinedPrice}"/> <GridViewColumn Header="Urgency" DisplayMemberBinding="{Binding Urgency}"/> </GridView> </ListView.View> </ListView>
关键改动点说明:
- 绑定内部ListView的宽度:通过
RelativeSource找到外层GridViewColumn的单元格容器(ContentPresenter),绑定它的ActualWidth,这样内部ListView就会和外层单元格保持同宽,哪怕用户拖动调整外层列宽也会自动跟着变。 - 抵消默认内边距:内部ListView默认有6px左右的内边距,设置
Margin="-6"可以把这个留白去掉,让内容完全撑满单元格。 - 内部列用*分配宽度:把内部GridView的列宽设为
*,这样三列会按比例均分内部ListView的可用宽度,而不是只显示内容的最小宽度。如果需要更精细的分配,还可以用Width="2*"这类写法,让某一列宽度是其他列的两倍。
内容的提问来源于stack exchange,提问作者asd
相关产品推荐
相关产品推荐

