none
WPF Resaltar un listview con el color de la fila actual o directamente q sea transparente RRS feed

  • Pregunta

  • Tengo una aplicacion en WPF con el patron MVVM donde aplicamos un listview y donde sus registros son de distintos colores. Al seleccionar cada fila necesito que el color de seleccion sea el mismo color de la fila o en su defecto transparente.

    Use la propiedad transparent en el tag SolidBrush pero el color de seleccion se pone en gris.

    Alguien tuvo este problema? Pudo Resolverlo?

    sábado, 4 de febrero de 2012 16:19

Todas las respuestas

  • Hola Carina.

    ¿Puedes poner el codigo xaml del listview para ver como lo tienes implementado?

    En un principio, implementando una plantilla para los items y estableciendo un trigger deberia de funcionar, pero depende de como lo tengas implementado, prueba un codigo como este:

    <ListView ItemsSource="{Binding}" x:Name="customerListView" SelectionMode="Single" ItemContainerStyle="{DynamicResource ListViewItemStyle1}">


    y en los recursos la definicion del estilo ItemContainerStyle:

            <!-- Estilo para el los items del listview -->
            <Style x:Key="ListViewItemStyle1" TargetType="{x:Type ListViewItem}">
                <!-- fondo normal -->
                <Setter Property="Background" Value="Red" />
    
                <!-- fondo para cuando esta seleccionado un item -->
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="Red" />
                    </Trigger>
                </Style.Triggers>
                
            </Style>

    En este ejemplo he puesto las filas rojas y en el trigger tambien rojo, si se hace un binding, se debe modificar de igual forma, ya que tiene que tener el mismo color ambas. Como el trigger cambia la propiedad background, no se puede establecer en transparente, ya que este se quedaria sin color y es como si la fila fuera transparente.


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    jueves, 9 de febrero de 2012 15:38
  • David,

    Probe en un ejemplo sencillo pero no al seleccionar la fila la pinta de gris. Copie lo que me pasaste. Y mi codigo quedo asi:

    <Window x:Class="ListViewDataBindingSample.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ListViewDataBindingSample"
        Title="Databinding Sample" Height="300" Width="615">
        <Window.Resources>
            <local:BooleanConverter x:Key="formatter"/>
    
            <Style x:Key="ItemStyle" TargetType="{x:Type ListViewItem}">
                <!-- fondo normal -->
                <Setter Property="Background" Value="Red" />
    
                <!-- fondo para cuando esta seleccionado un item -->
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="Red" />
                    </Trigger>
                </Style.Triggers>
            </Style>        
        </Window.Resources>    
        <Grid  Name="gridElements" VerticalAlignment="Stretch" >
                <ListView  Name="lsvElements" FontSize="11" BorderBrush="DarkGray" BorderThickness="1" SelectionMode="Single"
                        ItemContainerStyle="{DynamicResource ItemStyle}">
                    <ListView.View >
                        <GridView AllowsColumnReorder="True">
                            <GridViewColumn DisplayMemberBinding="{Binding Path=EmpID}" Header="EmpID" Width="75"/>
                            <GridViewColumn DisplayMemberBinding="{Binding Path=EmpName}" Header="Name" Width="200"/>
                            <GridViewColumn DisplayMemberBinding="{Binding Path=Designation}" Header="Designation" Width="175" />
                            <GridViewColumn DisplayMemberBinding="{Binding Path=IsManager, Converter={StaticResource formatter}}" Header="IsManager" Width="75" />
                            <GridViewColumn DisplayMemberBinding="{Binding Path=Age}" Header="Age" Width="75"/>
                        </GridView>
                    </ListView.View>
                </ListView>
            </Grid>
    </Window>
    


    Carina Correjidor

    viernes, 10 de febrero de 2012 13:54
  • Hola Carina.

    Si, el codigo que he puesto funciona para sistemas con interface aero (a partir de windows vista), en tu imagen veo que usas un xp, de modo que lo he probado y no tiene el mismo comportamiento, es posible que use la seleccion predeterminada del sistema y en xp no se usa transparencia con lo que el resultado es el color del tema predeterminado (en tu caso el gris por el tema plata de win xp).

    Bueno, para forzar que cambie de color, he echo alguna prueba y basta con sobreescribir el color predeterminado del border que contiene el item del elemento (por no modificar la plantilla completa), de modo que el estilo se quedaria de la siguiente forma:

            <Style x:Key="ItemStyle" TargetType="{x:Type ListViewItem}">
                <!-- fondo normal -->
                <Setter Property="Background" Value="Red" />
    
                <!-- fondo para cuando esta seleccionado un item -->
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="Red" />
                    </Trigger>
                </Style.Triggers>
    
                <!-- modificar el color usado por el elemento 'border' de la plantilla (para windows XP) -->
                <Style.Resources>
                    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red"/>
                </Style.Resources>
            </Style>

    Solo he añadido el tag <style.Resources>, que lo que hace es sobreescribir el color usado por el elemento border de la plantilla predeterminada del item.

    Pruebalo y cuentas que tal.



    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    lunes, 13 de febrero de 2012 8:53