2010-03-22 12 views
11

Esiste un modo standard/migliore per distanziare gli elementi in un WPF ListBox, in modo che vi sia spazio tra articoli consecutivi, ma non sopra il primo o sotto l'ultimo?Aggiungere spazio tra gli elementi in un ListBox WPF/Silverlight senza spazio sopra l'ultimo o sotto l'ultimo

Per me, il modo più ovvio per aggiungere spazi è modificare lo ItemTemplate per includere lo spazio sopra, sotto o entrambi sopra e sotto ciascun elemento. Questo, ovviamente, significa che ci sarà spazio sopra/sotto il primo e/o ultimo oggetto, o un singolo oggetto.

Potrei usare i trigger per selezionare diversi modelli per il primo, l'ultimo, gli articoli intermedi, ma mi chiedo se c'è qualcosa di più semplice che mi manca - sembra che controllare la spaziatura sarebbe un requisito comune.

Grazie.

NOTA: Sto lavorando in WPF, ma supponiamo che questo sia simile se non identico in Silverlight XAML.

risposta

11

Quello che vorrei fare è dare un margine negativo al modello di controllo ListBox e assegnare lo stesso margine a DataTemplate/ItemContainerStyle. che rendono lo spazio nel primo e nell'ultimo elemento. Controlla il sotto XAML. Invece di impostare nel DataTemplate ho dato un margine al Button (ListBoxItem) stesso.

<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

Mi piace la semplicità di questa soluzione, ma l'utilizzo di un margine negativo influisce sul layout dei controlli adiacenti (nel mio caso, tagliando il contenuto del testo). Invece, ho usato la parte superiore e inferiore 'Padding' sul' ListBox', con buoni risultati. – Jay

+0

L'idea di riempimento negativo è un po 'controintuitiva, ma rappresenta una soluzione semplice e diretta. –

+0

Sì, è necessario renderlo corretto, ho solo mostrato un'idea meno impegnativa da seguire. Qualunque sia il margine superiore e inferiore che desideri dare agli elementi figli, dai lo stesso ma negativo sul visual ListBox.ControlTemplate. –

2

È possibile utilizzare un StyleSelector e assegnarlo alla proprietà ItemContainerStyleSelector. Nel selettore di stile, devi semplicemente scegliere uno stile diverso in base al fatto che l'articolo sia il primo, l'ultimo o altro

+0

+1 Grazie; questa è una buona soluzione; è solo più di quanto voglio essere necessario quando l'unica differenza di stile è lo spazio bianco circostante. – Jay

Problemi correlati