2010-11-22 272 views
12

我有一個包含一些ListViewItems的ListView。默認情況下,選擇項目會使其背景變爲深藍色。我想申請一種風格,選擇一個項目不會改變它的外觀。更改WPF ListViewItem的選擇顏色

在我的XAML我已經達到了這個:

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

不幸的是,這並沒有做的伎倆。它只是簡單地選擇白色而不是藍色。

有沒有人有想法?

最良好的祝願, 基督教

編輯: 示例代碼:

<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

感謝您的快速響應。我試過你的代碼,它給了我幾乎所需的東西。但是:在點擊物品之前,他們已經有了背景顏色。其中一些是綠色的,一些是紅色的,一些是黃色的,有些是橙色的。現在,當我選擇其中的一些時,它們都變白了。白色是因爲代碼中的「透明」。如果我將「透明」更改爲黑色,則全部變黑。我想達到的是他們保持與以前相同的顏色。那可能嗎?如果要告訴選擇的樣式資源,它不應該改變「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.htmlhttp://dotnetbutchering.blogspot.be/2009/08/how-to-set-wpf-listview-selected-item.html -the同樣的原則也適用於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>