2010-03-22 6 views
11

Gibt es eine Standard/beste Möglichkeit zum Platzieren von Elementen in einem WPF ListBox, so dass zwischen aufeinander folgenden Elementen Platz ist, aber nicht über dem ersten oder unter dem letzten?Fügen Sie Leerzeichen zwischen Elementen in einer WPF/Silverlight ListBox ohne Leerzeichen über dem ersten oder unter dem letzten hinzu

Für mich ist die naheliegendste Methode zum Hinzufügen von Abstand, die ItemTemplate so zu ändern, dass der Abstand über, unter oder über und unter jedem Element enthalten ist. Dies bedeutet natürlich, dass über/unter dem ersten und/oder letzten Gegenstand oder einem einzelnen Gegenstand Platz ist.

Ich könnte Trigger verwenden, um verschiedene Vorlagen für die ersten, letzten, Zwischenelemente auszuwählen, aber frage mich, ob es etwas einfacher ist, dass ich vermisse - scheint, Kontrolle Abstand wäre eine häufige Anforderung.

Danke.

HINWEIS: Ich arbeite in WPF, aber davon ausgehen, dass dies ähnlich ist, wenn nicht identisch in Silverlight XAML.

Antwort

11

Was ich tun würde, ist, geben Sie einen negativen Rand auf der ListBox Steuerelementvorlage, und geben Sie den gleichen Rand zum DataTemplate/ItemContainerStyle. welche den Raum in den ersten und letzten Gegenständen machen. Überprüfen Sie die folgenden XAML. Stattdessen habe ich in der DataTemplate einen Rand zum Button (ListBoxItem) selbst gesetzt.

<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

Ich mag die Einfachheit dieser Lösung, aber die Verwendung eines negativen Randes beeinflusst das Layout benachbarter Steuerelemente (in meinem Fall Textinhalt abschneiden). Stattdessen habe ich einen negativen oberen und unteren "Padding" auf der "ListBox" verwendet, um einen guten Effekt zu erzielen. – Jay

+0

Die Idee der negativen Füllung ist ein wenig kontraintuitiv, aber es macht eine wirklich einfache und einfache Lösung. –

+0

Ja, Sie müssen es richtig machen, ich zeigte nur eine weniger Mühe Idee zu gehen. Wie auch immer der obere und untere Rand, den Sie den untergeordneten Elementen geben möchten, geben Sie das gleiche, aber negative auf dem ListBox.ControlTemplate Visual. –

2

Sie könnten ein StyleSelector und weisen es die ItemContainerStyleSelector Eigenschaft verwenden. In der Stilauswahl wählen Sie einfach einen anderen Stil basierend darauf, ob der Artikel der erste, letzte oder andere ist.

+0

+1 Danke; das ist eine gute Lösung; es ist einfach mehr als ich möchte, wenn der einzige Styling-Unterschied der umgebende Whitespace ist. – Jay

Verwandte Themen