【问题标题】:Listbox Vertical Gap between Items (Remove??)项目之间的列表框垂直间隙(删除??)
【发布时间】:2016-03-10 12:26:26
【问题描述】:

我的列表框是由使用 DataTemplate 进行数据绑定的对象列表驱动的数据,例如:

            <ListBox x:Name="TheMainListBox" 
                 ScrollViewer.IsVerticalRailEnabled="True" 
                 ScrollViewer.IsHorizontalRailEnabled="False" 
                 HorizontalAlignment="Left" 
                 VerticalAlignment="Top"
                 Height="540" 
                 ItemsSource="{Binding}"
                 Width="Auto"
                 Margin="0"
                 Padding="0"
                 Background="Yellow"
                 ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
                 ScrollViewer.VerticalScrollBarVisibility="Auto" 
                 SelectionChanged="TheMainListBox_SelectionChanged" 
                 DoubleTapped="TheMainListBox_DoubleTapped"  
                 >

模板:

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid or Stackpanel Background="Blue"
                         Padding="0"                                    
                         BorderBrush="Black"
                         BorderThickness="1"
                         Margin="0"
                     >
                     .... Binding Textboxes/blocks
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>

我最终得到了一个黄色容器,ListBox,.. 里面有蓝色矩形,ListBox 项目,但它们之间有一个垂直间隙。我可以设置一个负的垂直顶部边距,但这很粗糙并且不适用于顶部项目。如何将项目之间的垂直间隙减小到零。

如果创建一个包含静态项的 ListBox,每个项都在一个 ListBoxItem 容器中,例如:

                <ListBoxItem BorderThickness="1" Width="100" Height="50"
                  BorderBrush="Black" Background="Red"/>

一切都按要求工作。

那么如何使用 ItemTemplate/DataBinding 消除项目之间的垂直间距? 这是关键任务,提前谢谢。

【问题讨论】:

    标签: c# xaml listbox win-universal-app


    【解决方案1】:

    我没有时间加载项目进行测试,但您应该能够杀死可能导致它的边距/填充。所以添加;

    <ListBox.ItemContainerStyle>
       <Style TargetType="ListBoxItem">
          <Setter Property="Padding" Value="0"/>
          <Setter Property="Margin" Value="0"/>
       </Style>
    </ListBox.ItemContainerStyle>
    

    【讨论】:

    • @DavidJones 当然,ItemTemplate 只是通过嵌入在 ListBoxItem 中的 ContentPresenter 显示的内容。另一方面,ItemContainerStyle 用于设置实际 Container 的样式,即 ListBoxItem 本身及其样式模板。应用在 ItemTemplate 中,您实际上是 ListBoxItem 的子项。应用在 ItemContainer 中,您是 ListBoxItem 的父级。希望这是有道理的。
    【解决方案2】:

    我没有想过很多为什么会发生这种情况,还没有深入研究样式,我的答案看起来不太好,但试试Margin="0,-2,0,-2"

                <DataTemplate>
                    <Grid or Stackpanel Background="Blue"
                         Padding="0"                                    
                         BorderBrush="Black"
                         BorderThickness="1"
                         Margin="0,-2,0,-2"
                     >
                     .... Binding Textboxes/blocks
                    </Grid>
                </DataTemplate>
    

    【讨论】:

    • 垂直负边距的问题是顶部项目可能会被截断或溢出到上面的元素。对于一种情况,我尝试过 Margin="-12,-12,0,-12" 但我觉得这太过分了。
    • @DavidJones,是的,这是一个修复。如果 Chris W. 的答案有效,那么就是这个。
    【解决方案3】:

    正确设置 ListBoxItem 的高度可以解决问题。这是代码sn -p

    <ListBox.ItemContainerStyle>
     <Style TargetType="ListBoxItem">
       <Setter Property="Height" Value="Your_Desired_Height"/>
     </Style>
    </ListBox.ItemContainerStyle>
    

    对于列表框,请使用 Height 属性,对于列表视图,请使用 MinHeight 属性。替换 Your_Desired_Height 占位符中所需的高度值。

    【讨论】: