我有一个带有多个标题的WPF ListBox。我通过使用GroupStyle实现了这一点,我在其中定义了每个头的外观:
<ListBox DataContext="{StaticResource MyGroups}" ItemsSource="{Binding}">
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<!-- my header stuff -->
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListBox.GroupStyle>
<!-- ListBox.ItemTemplate.. not shown -->
</ListBox>
不知何故,这会导致各个ListBoxItems在其各自的标题下略微“缩进”(删除GroupStyle会删除缩进,以及所有标题)。
我有点明白为什么他们会希望它们默认缩进,但是无论如何要移除那个小的左边距?我试图为ListBoxItem定义一个样式来设置Padding = 0,但结果是一样的。
答案 0 :(得分:4)
我可以删除缩进的唯一方法是在 GroupStyle.ContainerStyle 中为 GroupItem 引入我自己的控件模板。该模板由两个网格行组成,标题为1,组项为1。
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="GroupItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="GroupItem">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="{Binding MyHeaderText}"/>
<ItemsPresenter Grid.Row="1"/>
</Grid>
</ControlTemplat>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</ListBox.GroupStyle>
答案 1 :(得分:1)
在左侧边距为-20,然后在(+)20处放置列表框项目。这些都会影响结果吗?
如果是这样,根据需要调整到适当的大小。
答案 2 :(得分:1)
谢谢你的回答,肯定!只是想补充一点,如果你需要在组头中显示自定义模板,那么你可能想要使用这样的东西:
<ControlTemplate TargetType="GroupItem">
<StackPanel>
<ContentPresenter
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
/>
<ItemsPresenter />
</StackPanel>
</ControlTemplate>
答案 3 :(得分:1)
我取得了一些成功,否定了ItemsPresenter
页边距:
<ListBox>
...
<ListBox.Resources>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Margin" Value="-5,0,0,0"></Setter>
</Style>
</ListBox.Resources>
</ListBox>
但它并不完全优雅。
答案 4 :(得分:0)
劳伦斯·帕克(Lawrence Parker)在2008年提出了有效的解决方案,