2010-03-22 15 views
11

¿Hay una manera estándar/mejor para espaciar elementos en un WPF ListBox, de modo que haya espacio entre elementos consecutivos, pero no debajo del último?Agregue espacio entre elementos en un ListBox WPF/Silverlight sin espacio arriba primero o debajo del último

Para mí, la forma más obvia de agregar espacios es modificar ItemTemplate para incluir espacio arriba, abajo o ambos arriba y debajo de cada elemento. Esto, por supuesto, significa que habrá espacio encima/debajo del primer y/o último artículo, o de un solo artículo.

Podría utilizar los factores desencadenantes para seleccionar diferentes plantillas para los elementos primero, último, intermedio, pero me pregunto si hay algo más simple que me falta, parece que controlar el espacio sería un requisito común.

Gracias.

NOTA: Estoy trabajando en WPF, pero supongo que esto es similar si no idéntico en Silverlight XAML.

Respuesta

11

Lo que haría es dar margen negativo en la plantilla de control ListBox y dar el mismo margen a DataTemplate/ItemContainerStyle. que hacen que el espacio en el primer y último elemento. Verifique el siguiente XAML. En lugar de configurar en el DataTemplate he dado margen al botón (ListBoxItem) en sí.

<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> 
+1

Me gusta la simplicidad de esta solución, pero usar un margen negativo afecta el diseño de los controles adyacentes (en mi caso, cortando el contenido del texto). En su lugar, he usado 'relleno' negativo superior e inferior en el 'ListBox', con buenos resultados. – Jay

+0

La idea del relleno negativo es un poco contradictorio, pero proporciona una solución realmente simple y directa. –

+0

Sí, necesitas hacerlo de la forma adecuada, solo mostré una idea de menos esfuerzo para ir. Cualquiera que sea el margen superior e inferior que desee otorgar a los elementos secundarios, proporcione el mismo aspecto negativo en la vista visual ListBox.ControlTemplate. –

2

Se puede usar un StyleSelector y asignarlo a la propiedad ItemContainerStyleSelector. En el selector de estilos, simplemente elige un estilo diferente según si el artículo es el primero, el último u otro

+0

+1 Gracias; Esta es una buena solución; es solo más de lo que quiero ser necesario cuando la única diferencia de estilo es el espacio en blanco circundante. – Jay

Cuestiones relacionadas