2010-11-22 33 views
12

Tengo un ListView que contiene algunos ListViewItems. De manera predeterminada, la selección de elementos hace que el fondo se vuelva azul profundo. Me gustaría aplicar un estilo tal que seleccionar un elemento no cambie su aspecto.Cambiar color de selección de WPF ListViewItem

En mi xaml ya lo han conseguido:

<Style TargetType="ListViewItem"> 
    <Style.Resources> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/> 
    </Style.Resources> 
</Style> 

Por desgracia, esto no hace el truco. Simplemente hace que la selección sea blanca en lugar de azul.

¿Alguien tiene una idea?

mejores deseos, cristianos

EDIT: Código muestra:

<Window.Resources> 
    <Style TargetType="ListViewItem"> 
     <Style.Resources> 
       <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" 
           Color="Black"/>      
       <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
           Color="Transparent"/> 
     </Style.Resources> 
    </Style> 
</Window.Resources> 



<ListView x:Name="lvTestRun" ItemsSource="{Binding Path=TestRunData}" Margin="177,26,8,53.277" SelectionMode="Multiple"> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="Status"/> 
        <GridViewColumn Header="Duration"/> 
        <GridViewColumn Header="Start Time"/> 
        <GridViewColumn Header="End Time"/> 
       </GridView> 
      </ListView.View> 
     </ListView> 

el fin de reproducir esto, puede que tenga que configurar el color de fondo de una sola ListViewItem a algo como el verde o rojo

Respuesta

27

No estoy seguro de entender lo que quiere decir con blanco en lugar de azul. Cuando se selecciona un ListViewItem, el primer plano y el fondo se cambian mediante un desencadenador. Para cambiar el primer plano de un ListViewItem puede utilizar esta

<ListView ...> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="{x:Type ListViewItem}"> 
      <Style.Resources> 
       <!-- Foreground for Selected ListViewItem --> 
       <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" 
           Color="Black"/> 
       <!-- Background for Selected ListViewItem --> 
       <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
           Color="Transparent"/> 
      </Style.Resources> 
     </Style> 
    </ListView.ItemContainerStyle> 
    ... 
</ListView> 

actualización

Prueba esto para volver a plantillas. He quitado todos los disparadores para el seleccionado

<ListView ...> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="{x:Type ListViewItem}"> 
      <Style.Resources> 
       <LinearGradientBrush x:Key="ListItemHoverFill" EndPoint="0,1" StartPoint="0,0"> 
        <GradientStop Color="#FFF1FBFF" Offset="0"/> 
        <GradientStop Color="#FFD5F1FE" Offset="1"/> 
       </LinearGradientBrush> 
      </Style.Resources> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <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> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ListView.ItemContainerStyle> 
</ListView> 
+0

Gracias por la respuesta rápida. Probé tu código y me da casi lo que quiero. Sin embargo: antes de hacer clic en los elementos, ya tienen un color de fondo. Algunos de ellos son verdes, algunos son rojos, otros son amarillos y otros son anaranjados. Ahora cuando selecciono un número de ellos, todos se ponen blancos. Blanco debido a la "Transparencia" en su código. Si cambio Transparente a Negro, todos se ponen negros. Lo que me gustaría lograr es que permanezcan del mismo color que antes. ¿Es eso posible? ¿Como para decirle al recurso de estilo que al seleccionarlo NO debería cambiar el "HighlightBurshKey"? – Christian

0

Lo que normalmente hago es definir ese color en la colección de recursos de la lista. Luego, para cada elemento, puedo definir una plantilla con los colores que me gustan y cuando selecciono, no obtengo el azul.

Creo que deberías tener algún tipo de indicación de que se ha seleccionado un elemento.

+0

¿No entiendo exactamente qué quiere decir con indicación de que se ha seleccionado un artículo? Lo que quiero es que no haya diferencia visual entre un elemento seleccionado y un elemento no seleccionado. Sé que esto suena extraño, pero la razón por la que quiero esto es porque en el ListView tengo una columna llamada "marcada" que contiene una casilla de verificación y esta casilla de verificación es mi indicación para una fila seleccionada. – Christian

5

Tener un vistazo a esto: http://www.wpftutorial.net/ListBoxSelectionBackground.html o http://dotnetbutchering.blogspot.be/2009/08/how-to-set-wpf-listview-selected-item.html -el mismo principio se aplica para el control ListView.

Por ejemplo, el siguiente código basado en activadores debería ser el truco e imitar el cambio de color cuando se cambia la selección.

<Style TargetType="{x:Type ListViewItem}"> 
    <Style.Triggers> 
     <Trigger Property="IsSelected" Value="true" > 
     <Setter Property="Foreground" Value="YourForegroundColour" /> 
     <Setter Property="Background" Value="YourBackgroundColour" /> 
     </Trigger> 
    </Style.Triggers> </Style> 
Cuestiones relacionadas