2010-11-22 4 views
12

У меня есть ListView, содержащий некоторые элементы ListViewItems. По умолчанию выбор элементов делает их фон немного синим. Я хотел бы применить стиль, чтобы выбор элемента не менял его внешний вид.Изменить цвет выбора WPF ListViewItem

В моем XAML я уже достиг этого:

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

К сожалению, это не делает трюк. Это просто делает белый выбор вместо синего.

У кого-нибудь есть идеи?

С наилучшими пожеланиями, христианские

EDIT: Пример кода:

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

Для того, чтобы воспроизвести это, возможно, придется установить фоновый цвет одного ListViewItem к чему-то, как зеленый или красный.

ответ

27

Я не уверен, что понимаю, что вы подразумеваете под белым, а не синим. Когда выбран ListViewItem, передний план и фон изменяются триггером. Для того, чтобы изменить передний план в ListViewItem вы можете использовать эту

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

Обновление

Попробуйте для повторного шаблонам. Я удалил все триггеры для выбранных

<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

Спасибо за быстрый ответ. Я попробовал ваш код, и это дает мне почти то, что я хочу. Однако: перед тем, как щелкнуть элементы, у них уже есть цвет фона. Некоторые из них зеленые, некоторые - красные, некоторые желтые, а некоторые оранжевые. Теперь, когда я выбираю несколько из них, они все становятся белыми. Белый из-за «Прозрачного» в вашем коде. Если я изменил Transparent на Black, они все чернеют. Я бы хотел достичь того, что они остаются того же цвета, что и раньше. Это возможно? Как в рассказе ресурса стиля, который при отборе не должен менять «HighlightBurshKey»? – Christian 2010-11-22 15:26:30

0

Что я обычно делаю, так это определить цвет в коллекции ресурсов listview. Затем для каждого элемента я могу определить шаблон с цветами, которые мне нравятся, и когда я выбираю, я не получаю синий цвет.

Я действительно думаю, что у вас должно быть какое-то указание, что элемент выбран.

+0

Я не совсем понимаю, что вы подразумеваете, указав, что элемент выбран? Я хочу, чтобы не было визуальной разницы между выбранным элементом и не выбранным. Я знаю, это звучит странно, но причина, по которой я хочу это, заключается в том, что в ListView у меня есть столбец с именем «checked», который содержит флажок, и этот флажок является моим индикатором для выбранной строки. – Christian 2010-11-22 15:28:53

5

Посмотрите на это: http://www.wpftutorial.net/ListBoxSelectionBackground.html или http://dotnetbutchering.blogspot.be/2009/08/how-to-set-wpf-listview-selected-item.html -то же принцип применяется для управления ListView.

Например, следующий код на основе триггеров должен сделать трюк и не подражать изменению цвета при изменении выбора.

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