WPF ListBox实现每行3列(含图片与文本)布局的问题
WPF ListBox实现每行3列(含图片与文本)布局的问题
嘿,我看你现在卡在ListBox的横向布局上了——想让每行放3个带图片和文本的项,但不管怎么调,ListBox里的项还是竖着排,只有Item内部的StackPanel是水平的?这问题我之前也碰到过,核心是你找错了布局的位置~
你当前代码里的问题在于:UniformGrid被放在了ItemTemplate里,这只会影响单个Item内部的布局,而ListBox默认的ItemsPanel是垂直方向的StackPanel,所以所有Item还是会从上到下挨个排列。要实现每行3列的效果,得把UniformGrid放到ItemsPanel里,用来控制所有Item的排列方式。
给你个调整后的完整代码示例:
<ListBox Name="lsbox" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ItemsSource="{Binding Cards}" SelectedItem="{Binding SelectedItem}"> <!-- 替换默认的ItemsPanel为UniformGrid,设置每行3列 --> <ListBox.ItemsPanel> <ItemsPanelTemplate> <UniformGrid Columns="3" /> </ItemsPanelTemplate> </ListBox.ItemsPanel> <!-- 每个Item内部的布局,这里改成垂直排列文本+图片更合理,你也可以根据需求调Orientation --> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Vertical" Margin="10" HorizontalAlignment="Center"> <TextBlock Margin="3" Text="{Binding Name}" HorizontalAlignment="Center"/> <Image Width="200" Height="300" Margin="5" Source="{Binding Path}"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
我给你拆解下关键改动:
- 新增了
ListBox.ItemsPanel部分,用UniformGrid作为所有Item的容器,设置Columns="3"就会自动把Item按每行3个排列,超出后自动换行。 - 调整了ItemTemplate里的StackPanel为垂直方向,这样每个Item里的文本在图片上方,看起来更规整,你要是还是想水平排列也可以改回
Orientation="Horizontal"。 - 去掉了你原来放在ItemTemplate里的
UniformGrid,那个位置放它起不到全局布局的作用。
另外补充个小细节:如果你的Item数量不是3的倍数,UniformGrid会自动把最后一行的项居中对齐(默认行为),要是你想让它们左对齐,可以给UniformGrid加HorizontalAlignment="Left"。
备注:内容来源于stack exchange,提问作者Robin Harz
相关产品推荐
相关产品推荐

