2009-11-12 25 views
48

Tengo un cuadro de lista en WPF, y cuando seleccionan un elemento, muestra un color feo ¿Puedo hacer que todos los elementos no sean seleccionables?hacer elementos Listbox en WPF no seleccionables

+0

posible duplicado de [No hay ListBox.SelectionMode = "None", ¿hay otra manera de desactivar la selección en un cuadro de lista?] (Http://stackoverflow.com/questions/ 1398559/there-is-no-listbox-selectionmode-none-is-there-another-way-to-disable-select) –

+1

¿me estás tomando el pelo? Esta pregunta es de 2009 y me está diciendo ahora, después de 6 años que está duplicado? Ok –

+2

Nunca es demasiado tarde para ordenar cosas –

Respuesta

84

Si usted no necesita la selección, utilice un ItemsControl en lugar de un ListBox

+15

No siempre es cierto; 'ItemsControl' no puede hacer algunas cosas que' ListBox' puede necesitar, como 'ScrollIntoView' cuando usa la virtualización. –

+3

No necesariamente cierto. Puede haber muchas razones para no querer usar el mecanismo de selección * original * de un ListBox pero aún conserva la funcionalidad: solo para nombrar un ejemplo, considere un ListBox de imágenes donde quiera agregar una casilla adicional en la esquina de cada imagen para habilitar la selección. Va a conectar esta casilla de verificación al mecanismo de selección original de todos modos, todavía desea deshabilitar la selección de clic original de ListBox. –

12

Si no las quiere seleccionar, entonces probablemente no desee una vista de lista. Pero si esto es lo que realmente necesita, entonces puede hacerlo con un estilo:

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Page.Resources> 


<Style x:Key="{x:Type ListBoxItem}" TargetType="{x:Type ListBoxItem}"> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
     <Border 
      Name="Border" 
      Padding="2" 
      SnapsToDevicePixels="true"> 
      <ContentPresenter /> 
     </Border> 
     <ControlTemplate.Triggers> 
      <Trigger Property="IsSelected" Value="true"> 
      <Setter TargetName="Border" Property="Background" Value="#DDDDDD"/> 
      </Trigger> 
      <Trigger Property="IsEnabled" Value="false"> 
      <Setter Property="Foreground" Value="#888888"/> 
      </Trigger> 
     </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

    </Page.Resources> 
    <Grid> 
    <ListBox> 
     <ListBoxItem>One</ListBoxItem> 
     <ListBoxItem>Two</ListBoxItem> 
     <ListBoxItem>Three</ListBoxItem> 
    </ListBox> 
    </Grid> 
</Page> 

Mira el IsSelected Trigger. Puede hacer que el borde tenga un color diferente para que no sea "feo" o establecerlo en transparente y no será visible cuando se seleccione.

Espero que esto ayude.

+2

Agregar ** ** también para deshacerse del rectángulo de foco. –

1

puede manejar el evento SelectionChanged de ListBox y deseleccionar el elemento seleccionado en el controlador de eventos.

3

Una manera simple de hacer esto (utilizando la respuesta de viky anterior) es establecer el índice seleccionado a -1 en SelectionChanged(), de la siguiente manera.

public void OnListView_SelectionChanged(Object sender, RoutedEventArgs e) 
{ 
    if (null != sender && sender is ListView) 
    { 
     ListView lv = sender as ListView; 
     lv.SelectedIndex = -1; 
    } 
} 
4

Hay una manera aún más fácil: juego de ListBox propiedad IsHitTestVisible="False". Esto evita que todos los elementos de la lista reciban eventos del mouse. Esto tiene la ventaja de detener el resaltado al pasar el mouse también.

Funciona para mí en WP 7.1.

+2

pero luego todo el listbox no responde ... barras de desplazamiento incluidas. –

+1

@EladKatz: esto es cierto. Por eso a veces termino agregando mi propio 'ScrollViewer' alrededor del' ListBox' para restablecer el desplazamiento. –

+0

@DeniseDraper es una buena idea, pero mi scrollviewer no se puede "desplazar" cuando la lista está llena ... Sé que el contenido es suficiente para que la barra de desplazamiento funcione, pero simplemente permanece "inactiva" ... ¿algún pensamiento? – StinkyCat

2

Es mejor evitar los eventos, es más elegante y sin efectos secundarios, la etiqueta Style.

<ListBox> 
    <ListBox.ItemContainerStyle> 
    <Style TargetType="ListBoxItem"> 
     <Setter Property="IsEnabled" Value="False"/> 
    </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <StackPanel> 
     ... what you want as a source ... 
     </StackPanel> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
17

añadir una propiedad enfocable como falso en estilo ListBoxItem:

<Style x:Key="{x:Type ListBoxItem}" TargetType="{x:Type ListBoxItem}"> 
    <!-- Possibly other setters --> 
    <Setter Property="Focusable" Value="False" /> 
</Style> 
+2

Esta es la verdadera respuesta. –

0

También puede hacer ListBox deshabilitado, lo que le dará cuadro de lista estática, no interactivo.

<ListBox IsEnabled="False"/> 

Creo que esta es la solución lo más simple posible.

0

En mi caso había templado ListboxItems con un Textblock y un ComboBox. El único "activo" debería ser el Combo ...

<ScrollViewer VerticalScrollBarVisibility="Auto" 
       HorizontalScrollBarVisibility="Disabled" 
       CanContentScroll="True" /> 
    <ItemsControl> 
    ....here my content.... 
    </Itemscontrol> 
</ScrollViewer> 

funcionó bien para mí como era de esperar. BR, Daniel

11

Por favor, use esto dentro de su listbox. He encontrado esta solución muy elegante

<ListBox ItemsSource="{Binding YourCollection}"> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ListBoxItem}"> 
      <Setter Property="Focusable" Value="False"/> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 
+1

La solución más elegante de hecho – CCamilo

Cuestiones relacionadas