我正在使用WPF UniformGrid来绑定项目列表,xaml就像这个
<ListBox Name="lviewSearch" ItemsSource="{Binding SearchSettingsCollection}" SelectionMode="Multiple">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="2"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<ItemsControl Margin="3" Padding="5">
<DockPanel>
<Label Content="{Binding Label}" HorizontalAlignment="Stretch" Cursor="Hand" />
</DockPanel>
</ItemsControl>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
但是,如果项目数量较少,那么行之间的间距就太像这样了https://i.stack.imgur.com/Xr5qy.png
我该怎么做?
正如人们所说,你的UniformGrid有太多的垂直空间,所以它会扩展行以占据所有的空间(拉伸)。
你需要做的是通过设置来防止这种默认的拉伸行为
VerticalAlignment="Top"
UniformGrid的全部意义在于单元格的大小是一致的,因此大小相同。如果与垂直空间相比,你只有少量的行,那么每一行都会很高。相反,如果你有很多行,而垂直空间很小,那么每一行都会变得很小。如果这不是一个合适的外观,那么您需要使用不同的布局方法。
如果不了解更多关于视觉设计的信息,就不可能推荐一种可能的替代方案。ListBox的大小总是一样的,还是高度不同?显示的结果数量是变化的还是保持不变?所有这些都会改变你实现所需结果的方式。
一个简单的解决方案是在Listbox之外使用网格。将行高设置为自动。现在,统一网格将根据需要占用最小的空间。
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<ListBox Name="lviewSearch" ItemsSource="{Binding SearchSettingsCollection}" SelectionMode="Multiple">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="2"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<ItemsControl Margin="3" Padding="5">
<DockPanel>
<Label Content="{Binding Label}" HorizontalAlignment="Stretch" Cursor="Hand" />
</DockPanel>
</ItemsControl>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>