问题 在WPF / Silverlight ListBox中的项目之间添加空格,而不是在第一个或最后一个之上的空格


是否有标准/最佳方式来在WPF中分隔项目 ListBox,连续项之间有空格,但不高于第一项或低于最后一项?

对我来说,添加间距最明显的方法是修改 ItemTemplate 包括每个项目上方,下方或两者上方和下方的空间。当然,这意味着第一个和/或最后一个项目上方/下方的空间或单个项目。

我可以使用触发器为第一个,最后一个,中间项目选择不同的模板,但是想知道是否有一些我更缺的简单 - 似乎控制间距是一个常见的要求。

谢谢。

注意:我在WPF中工作,但假设这与Silverlight XAML中的相似(如果不相同)。


6045
2018-03-22 16:43


起源



答案:


我要做的是,在ListBox控件模板上给出负边距,并为DataTemplate / ItemContainerStyle提供相同的边距。这使得第一个和最后一个项目中的空间。检查以下XAML。而是在DataTemplate中设置我给Button(ListBoxItem)本身的边距。

   <Windows.Resources> 
     <ControlTemplate x:Key="ListBoxControlTemplate1" TargetType="{x:Type ListBox}">
        <Grid Background="{TemplateBinding Background}">
            <ItemsPresenter Margin="0,-5"/>
        </Grid>
       </ControlTemplate>
   </Window.Resources>


  <ListBox HorizontalAlignment="Center" VerticalAlignment="Center" Template="{DynamicResource ListBoxControlTemplate1}" Background="#FFAB0000">
        <Button Content="Button" Width="88" Margin="0,5"/>
        <Button Content="Button" Width="88" Margin="0,5"/>
        <Button Content="Button" Width="88" Margin="0,5"/>
        <Button Content="Button" Width="88" Margin="0,5"/>
        <Button Content="Button" Width="88" Margin="0,5"/>
    </ListBox>

11
2018-03-22 17:04



我喜欢这个解决方案的简单性,但使用负边距会影响相邻控件的布局(在我的情况下,切断文本内容)。相反,我使用了负顶部和底部 Padding 在...上 ListBox,效果很好。 - Jay
负填充的想法有点违反直觉,但它提供了一个非常简单和简单的解决方案。 - Robert Rossney
是的,你需要做到正确,我只是表现出一个不那么努力的想法。无论您希望为子元素提供的顶部和底部边距是什么,请在ListBox.ControlTemplate visual上给出相同但负面的内容。 - Jobi Joy


答案:


我要做的是,在ListBox控件模板上给出负边距,并为DataTemplate / ItemContainerStyle提供相同的边距。这使得第一个和最后一个项目中的空间。检查以下XAML。而是在DataTemplate中设置我给Button(ListBoxItem)本身的边距。

   <Windows.Resources> 
     <ControlTemplate x:Key="ListBoxControlTemplate1" TargetType="{x:Type ListBox}">
        <Grid Background="{TemplateBinding Background}">
            <ItemsPresenter Margin="0,-5"/>
        </Grid>
       </ControlTemplate>
   </Window.Resources>


  <ListBox HorizontalAlignment="Center" VerticalAlignment="Center" Template="{DynamicResource ListBoxControlTemplate1}" Background="#FFAB0000">
        <Button Content="Button" Width="88" Margin="0,5"/>
        <Button Content="Button" Width="88" Margin="0,5"/>
        <Button Content="Button" Width="88" Margin="0,5"/>
        <Button Content="Button" Width="88" Margin="0,5"/>
        <Button Content="Button" Width="88" Margin="0,5"/>
    </ListBox>

11
2018-03-22 17:04



我喜欢这个解决方案的简单性,但使用负边距会影响相邻控件的布局(在我的情况下,切断文本内容)。相反,我使用了负顶部和底部 Padding 在...上 ListBox,效果很好。 - Jay
负填充的想法有点违反直觉,但它提供了一个非常简单和简单的解决方案。 - Robert Rossney
是的,你需要做到正确,我只是表现出一个不那么努力的想法。无论您希望为子元素提供的顶部和底部边距是什么,请在ListBox.ControlTemplate visual上给出相同但负面的内容。 - Jobi Joy


你可以用一个 StyleSelector 并将其分配给 ItemContainerStyleSelector 属性。在样式选择器中,您只需根据项目是第一个,最后一个还是其他来选择不同的样式


2
2018-03-22 17:11



+1谢谢;这是一个很好的解决方案;当唯一的造型差异是周围的空白时,它比我想要的更多。 - Jay