使用为其ListBox定义的GroupStyle删除WPF ListBoxItem的左边距

时间:2012-10-10 07:36:21

标签: c# .net wpf listbox

我有一个带有多个标题的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,但结果是一样的。

5 个答案:

答案 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年提出了有效的解决方案,