2011-01-08 14 views
11

He buscado una respuesta al respecto, pero los posibles duplicados están más relacionados con la presentación que con la interacción.¿Extiende los elementos ListBox al área completa del ListBox? El estilo ListBox se establece implícitamente a través de un tema

Tengo un cuadro de lista básico, y el contenido de cada elemento es una cadena simple.

El ListBox en sí se estira para llenar su contenedor de cuadrícula, pero cada hitarea de ListBoxItem no refleja el ancho del ListBox. Parece que la hitarea (área de contacto del puntero) para cada elemento es solo el ancho del contenido del texto. ¿Cómo hago para estirar todo el ancho, independientemente del tamaño del texto?

He configurado HorizontalContentAlignment para Stretch, pero esto no resuelve mi problema. Mi única otra suposición es que el contenido en realidad se está estirando, pero el fondo es invisible y por lo tanto no captura el puntero del mouse.

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

El XAML es bastante directo en esto. Si paso el mouse sobre el texto en uno de los elementos, entonces todo el ancho del elemento se activa. Supongo que solo necesito saber cómo crear un fondo interactivo que sea invisible.

+0

Por favor, publique su XAML. – Zamboni

Respuesta

23

HorizontalContentAlignment="Stretch" debe establecerse en ItemContainerStyle para que esto funcione.

Xaml Ejemplo

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

actualización
Prueba este

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

¿Hay alguna manera de hacerlo sin sobreescribir mi estilo seleccionado actualmente? Estoy usando un tema externo, y no quiero editar eso. – Nicholas

+0

Parece sobrescribir mi estilo por completo si lo hago en el ListBox mismo. – Nicholas

+0

@Nicholas: Pruebe mi actualización –

2

Además, la adición a la respuesta de Fredrik, si se establece la propiedad del cuadro de lista ScrollViewer.HorizontalScrollBarVisibility a Disabled, los artículos serán siempre tener exactamente el ancho del cliente de ListBox.