2011-01-08 17 views
11

Szukałem odpowiedzi na to pytanie, ale potencjalne duplikaty są bardziej związane z prezentacją niż z interakcją.Stretch ListBox Przedmioty uderzają obszar do pełnej szerokości ListBox? Styl ListBox jest ustawiony domyślnie poprzez motyw:

Mam podstawowe pole listy, a zawartość każdego elementu jest prostym łańcuchem znaków.

Sam ListBox jest rozciągnięty, aby wypełnić jego kontener siatki, ale każdy z hitarea ListBoxItem nie odzwierciedla szerokości ListBox. Wygląda na to, że hitarea (obszar kontaktu wskaźnika) dla każdego elementu jest tylko szerokością treści tekstowej. Jak zrobić to rozciągnąć całą drogę, niezależnie od rozmiaru tekstu.

Ustawiłem HorizontalContentAlignment na Stretch, ale to nie rozwiązuje mojego problemu. Moim jedynym przypuszczeniem jest to, że treść faktycznie sięga, ale tło jest niewidoczne i nie przechwytuje wskaźnika myszy.

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

XAML jest dość prosty w tej kwestii. Jeśli przesuję wskaźnik myszy nad tekstem w jednym z elementów, wówczas cała szerokość elementu staje się aktywna. Chyba muszę wiedzieć, jak stworzyć interaktywne tło, które jest niewidoczne.

+0

Proszę zaksięgować swój XAML. – Zamboni

Odpowiedz

23

HorizontalContentAlignment="Stretch" należy ustawić w ItemContainerStyle, aby działało.

Xaml Przykład

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

Aktualizacja
Spróbuj

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

Czy można to zrobić bez nadpisywania aktualnie wybranego stylu? Używam zewnętrznego motywu i nie chcę tego edytować. – Nicholas

+0

Wydaje się, że całkowicie zastępuję mój styl, jeśli robię to na samym ListBoxie. – Nicholas

+0

@Nicholas: Wypróbuj moją aktualizację –

2

Ponadto, dodając do odpowiedzi Fredrik jest, jeśli ustawisz ListBox za ScrollViewer.HorizontalScrollBarVisibility właściwość Disabled, że przedmioty będą zawsze mieć dokładnie szerokość klienta ListBox.