2009-08-09 16 views
8

Ho WPF ListView con vista GridView e voglio rimuovere qualsiasi traccia di evidenziazione di riga.Rimozione di WPF ListView/GridView highlight chrome

Questo pezzo utile di codice può essere trovato in una risposta su questo sito:

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

Tuttavia, mentre questo cambiamento aiuta a rimuovere la maggior parte del punto culminante, non rimuove la barra orizzontale che appare ancora quando il mouse si sposta sulla riga ListView. Come lo rimuovo?

Mi sono occupato del problema simile di Button e ho trovato una soluzione che cambia il modello Button rimuovendo il suo chrome.

In questo caso di ListView/GridView non riesco a trovare il chrome e il modello corrispondenti da modificare.

risposta

14

Se avete installato Windows SDK, è possibile trovare la fonte XAML per tutti gli stili predefiniti (assumendo installato i campioni) in:

% Programmi% \ Microsoft SDK \ Windows \ v6.1 \ Samples \ WPFSamples.zip

Il file zip contiene una cartella Core che contiene AeroTheme, LunaTheme ecc. Che contengono l'origine per gli stili predefiniti. Sfortunatamente questi file sono piuttosto grandi (~ 8500 linee per Aero) e non molto ben strutturati o formattati (IMO).

Il modello di controllo di default per un ListViewItem assomiglia a questo:

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

La cosa migliore per la rimozione di tutto l'evidenziazione è probabilmente per sostituire il ControlTemplate con voi proprietario che solo include il GridViewRowPresenter (magari in un unico Border) . Non dimenticare di includere il trigger che oscura gli elementi quando il controllo è disabilitato.

+0

Evidenziazione superiore deve essere così! Stavo guardando il modello qui: http://msdn.microsoft.com/en-us/library/ms788717.aspx e dal momento che deve essere per un tema diverso, non ho potuto spiegare la barra. – Tony

+0

Posso confermare che il rettangolo UpperHighlight era il colpevole. Grazie! – Tony

+2

Incredibile ... solo in WPF ho dovuto ignorare completamente uno stile per eliminare un singolo elemento di evidenziazione. – aqua

0

Utilizzando il codice, non vedo alcuna riga. Qual è il tema predefinito in questo momento? Luna, Aero, ecc.? Potrebbe essere che il tuo è diverso dal mio, quindi una differenza di cromo. Ci sono altre impostazioni particolari sul tuo ListView?

Style Snooper o Show Me The Template potrebbe aiutarti a rintracciare l'elemento visivo responsabile della linea che stai vedendo. Potresti anche essere interessato a re-templating il tuo ListView per ottenere l'effetto desiderato.

+0

È il tema Vista, credo che sia Aero poiché ho effetti di vetro. In effetti le persone su XP non vedono la barra evidenziata. – Tony

8

Io non sono di fronte a un PC Windows per testare questo momento, ma ho avuto un problema simile con listboxes che ho fissato mettendo seguente nei miei Window.Resources

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

Non sono sicuro se funzionerà con il tuo listview però.

+1

Diversi blog e anwers indicano questo metodo ma, per qualche ragione, non ha mai funzionato per me. – Tony

+3

Grazie! Questo ha funzionato per me quando l'ho messo nelle risorse della mia finestra con Style targetType = "ListViewItem". Ho anche aggiunto una riga per impostare SystemColors.HighlightTextBrushKey su SystemColors.WindowTextColor altrimenti per impedire al colore del mio testo di passare al colore di sfondo (e quindi scomparire). –

+0

Per me funziona su ListView senza Gridview. Ma NON con Gridview. – Paparazzi

Problemi correlati