2010-12-03 27 views
28

Tengo problemas para encontrar la forma de no permitir que mi cuadro de lista resalte el elemento seleccionado. Sé que no agregué un disparador para resaltar el artículo. Todavía soy bastante nuevo en WPF =)Cómo deshabilitar el resaltado en el cuadro de lista pero mantener la selección?

¡Gracias!

<ListBox Name="CartItems" ItemsSource="{Binding}" 
     ItemTemplate="{StaticResource TicketTemplate}" 
     Grid.Row="3" Grid.ColumnSpan="9" Background="Transparent" 
     BorderBrush="Transparent"> 
</ListBox> 

Respuesta

44

respuesta tardía, pero no hay una solución mucho mejor y más simple:

<ListBox> 
    <ListBox.Resources> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" /> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" /> 
     <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" /> 
    </ListBox.Resources> 
</ListBox> 

Esto le permite tener un LisBox que se parece a un ItemsControl, pero tiene el apoyo para la selección.

Editar: Cómo funciona
"colores del sistema" Esto altera, en otras palabras, su tema de ventanas, sólo para este cuadro de lista y sus hijos (que en realidad desea orientar la ListboxItem).

Por ejemplo, situar un ListboxItem generalmente le da un fondo azul profundo, pero aquí lo configuramos en transparente (HighlightBrushKey).

Edición (30 de junio de 2016):
Parece para la última versión de Windows esto ya no es suficiente, también es necesario redefinir InactiveSelectionHighlightBrushKey

<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Transparent" /> 

Gracias a @packoman en los comentarios

+1

agradable y simple. gracias – Marek

+0

Hola, ¿pueden explicarme cómo funciona esto exactamente?Me tiene bastante confundido porque pensé que todo lo que hacían era definir brushs de colores sólidos para usarlos más adelante en el cuadro de lista, sin hacer ningún cambio real con ese fragmento de código. –

+1

@ClementHoang Agregué una explicación. –

0

Tendrá que volver a la plantilla ListBoxItem. En la plantilla predeterminada, tiene un disparador que se destaca cuando la propiedad IsSelected es true. Solo tienes que crear una plantilla que no tenga ese disparador.

+0

Aquí (http://msdn.microsoft.com/en-us/library/cc278062%28VS.95%29.aspx) es una página que muestra las plantillas de cuadro de lista y ListBoxItem. Puedes usarlos. – decyclone

4

la eliminación de la resaltando completamente siente muy extraño, ya que no sabe si ha seleccionado nada, pero esto es una versión de la plantilla de control que utiliza WhiteSmoke (que es muy sutil) en lugar de Blue

<Window.Resources> 
    <Style x:Key="ListBoxItemStyle1" TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="Background" Value="Transparent"/> 
     <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, 
      RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
     <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, 
      RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/> 
     <Setter Property="Padding" Value="2,0,0,0"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
        <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" 
          Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true"> 
         <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsSelected" Value="true"> 
          <Setter Property="Background" TargetName="Bd" Value="WhiteSmoke"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 

<Grid x:Name="LayoutRoot"> 
    <ListBox HorizontalAlignment="Left" VerticalAlignment="Top" ItemContainerStyle="{DynamicResource ListBoxItemStyle1}"> 
     <ListBoxItem Content="Item1"/> 
     <ListBoxItem Content="Item2"/> 
     <ListBoxItem Content="Item3"/> 
     <ListBoxItem Content="Item4"/> 
     <ListBoxItem Content="Item5"/> 
     <ListBoxItem Content="Item6"/> 
    </ListBox> 
</Grid> 
1

En la pestaña Propiedades, hay un campo habilitado con 2 opciones, verdadero y falso. Al convertir esto en falso, el Listbox permanece en blanco y la selección no está disponible. ¡Ya descubrí esto!

1

Estoy hablando de un truco que hice en mi aplicación WP8.

Agregué una imagen de marco transparente encima (se vio el borde de la imagen, piénselo como un marco de imagen). El desplazamiento era funcional, cualquier evento de manipulación se activaba solo porque los elementos de Listbox no se habían seleccionado por más tiempo.

<Grid 
     Grid.Row="0" 
     Margin="10,15" 
     Background="#FF008F88"> 
     <ListBox 
      x:Name="listBox_content" 
      Margin="20,15" 
      VirtualizingStackPanel.VirtualizationMode="Recycling"> 
     </ListBox> 

     <!-- TV image, middle is transparent so the ListBox can be seen --> 
     <Image 
       x:Name="image_tv" 
       Source="/Assets/Images/tvFrame.png" 
       Stretch="Fill"/> 
     <!----> 
    </Grid> 

Supongo que esto podría funcionar con una imagen transparente completa establecida en Relleno también.

38
 <ListBox.ItemContainerStyle> 
      <Style TargetType="ListBoxItem"> 
       <Setter Property="IsSelected" Value="{Binding Content.IsSelected, Mode=TwoWay, RelativeSource={RelativeSource Self}}"/> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="ListBoxItem"> 
          <ContentPresenter/> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </ListBox.ItemContainerStyle> 
+0

Funciona un amuleto - Gracias Wayne –

+0

La respuesta de @Baboon no funciona en Windows Phone 8.1: esta sí que funciona. Estupendo. – samjudson

+0

Esto responde si ya ha definido 'ListBox.ItemContainerStyle' – JwJosefy

Cuestiones relacionadas