2009-08-09 19 views
8

Tengo WPF ListView con vista GridView y quiero eliminar cualquier rastro de resaltado de fila.Eliminar WPF ListView/GridView resaltar cromo

Esta pieza útil de código puede encontrarse en una respuesta en este sitio:

 <ListView.ItemContainerStyle> 
     <Style TargetType="{x:Type ListViewItem}"> 
      <Setter Property="Control.Focusable" Value="False"/> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="Background" Value="{x:Null}" /> 
       <Setter Property="BorderBrush" Value="{x:Null}" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ListView.ItemContainerStyle> 

Sin embargo, aunque este cambio ayuda a eliminar la mayor parte de lo más destacado, no elimina la barra horizontal que todavía aparece cuando el mouse se mueve sobre la fila ListView. ¿Cómo lo elimino?

He tratado el problema similar relacionado con Button y he encontrado una solución que cambia la plantilla de Button quitando su chrome.

En este caso de ListView/GridView no puedo encontrar el cromo y la plantilla correspondientes para cambiar.

Respuesta

14

Si tiene instalado el SDK de Windows, se puede encontrar la fuente de XAML para todos los estilos por defecto (si se asume que ha instalado en las muestras):

% Archivos de programa% \ Microsoft SDK \ Windows \ v6.1 \ Samples \ WPFSamples.zip

El archivo zip contiene una carpeta Core que contiene AeroTheme, LunaTheme, etc., que contiene la fuente de los estilos predeterminados. Lamentablemente, estos archivos son bastante grandes (~ 8500 líneas para Aero) y no están muy bien estructurados o formateados (IMO).

La plantilla de control predeterminado para un ListViewItem se parece a esto:

<ControlTemplate TargetType="{x:Type ListViewItem}"> 
    <Border CornerRadius="2" SnapsToDevicePixels="True" 
      BorderThickness="{TemplateBinding BorderThickness}" 
      BorderBrush="{TemplateBinding BorderBrush}" 
      Background="{TemplateBinding Background}"> 
    <Border Name="InnerBorder" CornerRadius="1" BorderThickness="1"> 
     <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition MaxHeight="11" /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 

     <Rectangle Name="UpperHighlight" Visibility="Collapsed" Fill="#75FFFFFF" /> 
     <GridViewRowPresenter Grid.RowSpan="2" 
           VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
           SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
     </Grid> 
    </Border> 
    </Border> 

    <ControlTemplate.Triggers> 
    <Trigger Property="IsMouseOver" Value="True"> 
     <Setter Property="Background" Value="{StaticResource ListItemHoverFill}" /> 
     <Setter Property="BorderBrush" Value="#FFCCF0FF" /> 
     <Setter TargetName="UpperHighlight" Property="Visibility" Value="Visible" /> 
    </Trigger> 

    <Trigger Property="IsSelected" Value="True"> 
     <Setter Property="Background" Value="{StaticResource ListItemSelectedFill}" /> 
     <Setter Property="BorderBrush" Value="#FF98DDFB" /> 
     <Setter TargetName="InnerBorder" Property="BorderBrush" Value="#80FFFFFF" /> 
     <Setter TargetName="UpperHighlight" Property="Visibility" Value="Visible" /> 
     <Setter TargetName="UpperHighlight" Property="Fill" Value="#40FFFFFF" /> 
    </Trigger> 

    <MultiTrigger> 
     <MultiTrigger.Conditions> 
     <Condition Property="IsSelected" Value="True" /> 
     <Condition Property="Selector.IsSelectionActive" Value="False" /> 
     </MultiTrigger.Conditions> 

     <Setter Property="Background" Value="{StaticResource ListItemSelectedInactiveFill}" /> 
     <Setter Property="BorderBrush" Value="#FFCFCFCF" /> 
    </MultiTrigger> 

    <MultiTrigger> 
     <MultiTrigger.Conditions> 
     <Condition Property="IsSelected" Value="True" /> 
     <Condition Property="IsMouseOver" Value="True" /> 
     </MultiTrigger.Conditions> 

     <Setter Property="Background" Value="{StaticResource ListItemSelectedHoverFill}" /> 
     <Setter Property="BorderBrush" Value="#FF98DDFB" /> 
    </MultiTrigger> 

    <Trigger Property="IsEnabled" Value="False"> 
     <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" /> 
    </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

Su mejor opción para la eliminación de todo el resaltado es, probablemente, para reemplazar el ControlTemplate con su propiedad que solo incluye la GridViewRowPresenter (tal vez en un solo borde) . No olvides incluir el disparador que grays los elementos cuando el control está deshabilitado.

+0

¡Lo más destacado debe ser! Estaba mirando la plantilla aquí: http://msdn.microsoft.com/en-us/library/ms788717.aspx y como debe ser para un tema diferente, no pude explicar la barra. – Tony

+0

Puedo confirmar que el rectángulo UpperHighlight fue el culpable. ¡Gracias! – Tony

+2

Sorprendente ... solo en WPF tuve que anular por completo un estilo para deshacerme de un solo elemento destacado. – aqua

0

Usando su código, no veo ninguna línea en absoluto. ¿Cuál es tu tema predeterminado en este momento? Luna, Aero, etc.? Podría ser que el tuyo sea diferente al mío, por lo tanto, una diferencia en cromo. ¿Hay alguna configuración particular en su ListView?

Style Snooper o Show Me The Template pueden ayudarlo a rastrear el elemento visual responsable de la línea que está viendo. Usted también podría estar interesado en re-templating su ListView para obtener el efecto que desea.

+0

Es el tema de Vista, creo que es Aero ya que tengo efectos de vidrio. De hecho, las personas en XP no ven la barra de resaltado. – Tony

8

no estoy delante de un PC con Windows para probar esto ahora, pero tuve un problema similar con cuadros de lista, que me fijo, colocando lo siguiente en mis Window.Resources

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

No estoy seguro si Sin embargo, funcionará con tu lista de visitas.

+1

Varios blogs y anwers apuntan a este método pero, por alguna razón, nunca funcionó para mí. – Tony

+3

¡Gracias! Esto funcionó para mí cuando lo puse en mis recursos de ventana con Style targetType = "ListViewItem". También agregué una línea para establecer SystemColors.HighlightTextBrushKey a SystemColors.WindowTextColor de lo contrario para evitar que mi color de texto cambie al color de fondo (y desaparezca). –

+0

Para mí funciona en ListView sin vista Grid. Pero NO con Gridview. – Paparazzi