如何让WPF中的ListView拉伸填充列的高度
如何让WPF中的ListView拉伸填充列的高度
嗨,我看了你遇到的问题啦——明明给ListView和所有外层容器都设了VerticalAlignment="Stretch",也把列宽设成了*,但ListView却只有在有数据的时候才会填满列的高度,空的时候就缩成一小条,对吧?
这问题其实出在你用的StackPanel上!StackPanel的布局逻辑是“按需分配空间”,它只会给子元素刚好能容纳内容的高度,哪怕你给子元素设了Stretch,它也不会强制子元素填满自己的可用空间。所以哪怕外层的Border、Grid都已经拉伸到列的高度了,StackPanel这里会“拖后腿”,不让ListView伸展开。
解决方法很简单:把包裹ListView的StackPanel换成Grid就行!Grid的默认布局行为就是让子元素填充自己的可用空间,完全符合你的需求。
给你修改后的XAML代码示例:
<Grid> <TabControl> <TabItem Header="Main" Margin="1,-1,-2,1"> <Grid Background="#FFE5E5E5" > <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Border BorderBrush="Black" BorderThickness=".5" Padding="4" Grid.Column="0"> <!-- 替换StackPanel为Grid,默认就会让子元素拉伸填充 --> <Grid> <ListView x:Name="FilesDisplayed" ItemsSource="{Binding AllFilePaths}" SelectionChanged="FilesDisplayed_SelectionChanged" ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Visible"/> </Grid> </Border> </Grid> </TabItem> </TabControl> </Grid>
补充个小技巧:Grid的HorizontalAlignment和VerticalAlignment默认就是Stretch,所以你甚至可以去掉原来代码里那些重复设置的Stretch属性,代码会更简洁。如果之后你需要在这个区域里垂直排列多个元素,也可以给Grid添加RowDefinitions,把每个行的Height设成*(均分空间)或者Auto(按需分配),这样既能实现类似StackPanel的排列效果,又能让元素支持拉伸填充。
备注:内容来源于stack exchange,提问作者Ramza
相关产品推荐
相关产品推荐

