2011-01-08 1 views
11

Ich habe nach einer Antwort auf diese Suche, aber die potenziellen Duplikate sind mehr mit Präsentation als Interaktion.Stretch ListBox Elemente treffen Bereich auf volle Breite der ListBox? ListBox-Stil ist implizit durch ein Thema gesetzt

Ich habe ein einfaches Listenfeld, und der Inhalt jedes Elements ist eine einfache Zeichenfolge.

Die ListBox selbst wird gestreckt, um den Gittercontainer zu füllen, aber das Hitlistenfeld von ListBoxItem spiegelt nicht die ListBox-Breite wider. Es sieht so aus, als ob die Hitarea (Pointer-Kontaktfläche) für jedes Element nur die Breite des Textinhalts ist. Wie mache ich diese Strecke quer durch den ganzen Weg, unabhängig von der Textgröße.

Ich habe HorizontalContentAlignment auf Stretch festgelegt, aber das löst mein Problem nicht. Meine einzige andere Vermutung ist, dass der Inhalt sich tatsächlich ausdehnt, aber der Hintergrund unsichtbar ist und den Mauszeiger nicht erfasst.

<ListBox 
    Grid.Row="1" 
    x:Name="ProjectsListBox" 
    DisplayMemberPath="Name" 
    ItemsSource="{Binding Path=Projects}" 
    SelectedItem="{Binding Path=SelectedProject}" 
    HorizontalContentAlignment="Stretch"/> 

Das XAML ist ziemlich direkt auf diesem. Wenn ich den Mauszeiger über den Text in einem der Elemente bewege, wird die gesamte Breite des Objekts aktiviert. Ich denke, ich muss nur wissen, wie man einen interaktiven Hintergrund erstellt, der unsichtbar ist.

+0

Bitte posten Sie Ihre XAML. – Zamboni

Antwort

23

HorizontalContentAlignment="Stretch" sollte in ItemContainerStyle gesetzt werden, damit dies funktioniert.

XAML Beispiel

<ListBox xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
    <ListBox.ItemsSource> 
     <x:Array Type="{x:Type sys:String}"> 
      <sys:String>String 1</sys:String> 
      <sys:String>String 2</sys:String> 
      <sys:String>String 3</sys:String> 
      <sys:String>String 4</sys:String> 
     </x:Array> 
    </ListBox.ItemsSource> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding}" Background="Green"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

aktualisieren
Versuchen Sie, diese

<ListBox ...> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}"> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
     </Style> 
    </ListBox.ItemContainerStyle> 
+0

Gibt es eine Möglichkeit, dies zu tun, ohne meinen aktuell ausgewählten Stil zu überschreiben? Ich verwende ein externes Thema und möchte das nicht bearbeiten. – Nicholas

+0

Es scheint, meinen Stil vollständig zu überschreiben, wenn ich es auf der ListBox selbst mache. – Nicholas

+0

@Nicholas: Probiere mein Update –

2

Auch das Hinzufügen zu Fredriks Antwort, wenn Sie die ScrollViewer.HorizontalScrollBarVisibility Eigenschaft auf Disabled der List-Box gesetzt, werden die Elemente immer habe genau die Client-Breite der ListBox.