5

我有一个带有多个标题的 WPF 列表框。我通过使用 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>

不知何故,这会导致各个 ListBoxItem 在其各自的标题下略微“缩进”(删除 GroupStyle 会删除缩进以及所有标题)。

我有点明白为什么他们希望它们默认缩进,但是无论如何要删除那个小的左填充?我试图为 ListBoxItem 定义一个样式来设置 Padding = 0,但结果是一样的。

4

5 回答 5

5

我可以删除缩进的唯一方法是在GroupStyle.ContainerStyle中为GroupItem引入我自己的控件模板。

该模板由两个网格行组成,一个用于标题,一个用于组项目。

<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>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </GroupStyle.ContainerStyle>
    </GroupStyle>
</ListBox.GroupStyle>
于 2012-10-13T03:18:52.450 回答
2

ItemsPresenter我在否定利润方面取得了一些成功:

<ListBox>
...
  <ListBox.Resources>
    <Style TargetType="{x:Type ListBoxItem}">
      <Setter Property="Margin" Value="-5,0,0,0"></Setter>
    </Style>
  </ListBox.Resources>
</ListBox>

但它并不完全优雅。

于 2017-02-28T08:56:12.947 回答
1

为列表框项目输入 -20 的左边距,然后在 (+)20 处。其中任何一个都会影响结果吗?

如果是这样,请根据需要调整到适当的大小。

于 2012-10-10T18:00:04.723 回答
1

谢谢你的回答,kentoh!只想补充一点,如果您需要在组标题中显示自定义模板,那么您可能需要使用以下内容:

<ControlTemplate TargetType="GroupItem">
    <StackPanel>
        <ContentPresenter 
            Content="{TemplateBinding Content}" 
            ContentTemplate="{TemplateBinding ContentTemplate}"
        />
        <ItemsPresenter />
    </StackPanel>
</ControlTemplate>
于 2015-02-17T16:02:15.923 回答
-1

劳伦斯·帕克(Lawrence Parker)在 2008 年给出了一个有效的解决方案

于 2019-11-13T18:10:20.563 回答