2013-05-29 65 views
16

我试图将选定ListBoxItem的背景颜色设置为白色,而不是系统颜色。我已经阅读了我在SO上可以找到的内容,并且遵循了这些建议,或者相信遵循了其中的建议(Change background color for selected ListBox itemWPF How to change the listbox selected item text color when the list box loses focus,Change selected and unfocused Listbox style to not be grayed out和其他)。设置背景颜色或WPF(4.0)列表框 - Windows 8

通过将HighlightBrush和ControlBrush设置为Transparent作为所选项目,所有似乎都解决了这个问题。我有以下XAML,并且正确设置字体颜色,但是无论画笔设置如何,backgroound都是默认的透明蓝色。我仍然是一个WPF noob,所以我必须在这里错过简单的东西。

<ListBox Width="Auto" Height="Auto" Grid.Column="0" BorderThickness="0" Background="#FFF3F3F3" xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
    <ListBox.ItemsSource> 
     <x:Array Type="{x:Type sys:String}"> 
      <sys:String>String 1</sys:String> 
      <sys:String>String 2</sys:String> 
      <sys:String>String 3</sys:String> 
      <sys:String>String 4</sys:String> 
     </x:Array> 
    </ListBox.ItemsSource> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}"> 
      <Style.Resources> 
      <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" /> 
      <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" /> 
      </Style.Resources> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
      <Setter Property="FontSize" Value="16"/> 
      <Setter Property="Foreground" Value="#999999"/> 
      <Style.Triggers> 
      <Trigger Property="IsSelected" Value="True" > 
       <Setter Property="Background" Value="White" /> 
       <Setter Property="Foreground" Value="Black" /> 
      </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding}" HorizontalAlignment="Right" Margin="0,0,8,0" Background="Transparent"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

我希望任何在正确方向上的微调。

编辑

阅读的第一个答案,这为他们工作有轻微的改变后,我把我已经在我的Windows 8机器上开发应用程序,并在Windows 7虚拟机执行它,它按预期工作。有什么需要改变的想法,以使其在Windows 8机器和Windows 7上运行?

回答

39

这些职位渐渐过时的Windows 8。

在Windows-8由于某种原因,微软不希望人们编辑他们的默认Style的如此轻松或与Brush重叠。

ListBoxItem默认Style从VS有这样的选择会触发:

<MultiTrigger> 
    <MultiTrigger.Conditions> 
    <Condition Property="Selector.IsSelectionActive" 
       Value="False" /> 
    <Condition Property="IsSelected" 
       Value="True" /> 
    </MultiTrigger.Conditions> 
    <Setter TargetName="Bd" 
      Property="Background" 
      Value="#3DDADADA" /> 
    <Setter TargetName="Bd" 
      Property="BorderBrush" 
      Value="#FFDADADA" /> 
</MultiTrigger> 
<MultiTrigger> 
    <MultiTrigger.Conditions> 
    <Condition Property="Selector.IsSelectionActive" 
       Value="True" /> 
    <Condition Property="IsSelected" 
       Value="True" /> 
    </MultiTrigger.Conditions> 
    <Setter TargetName="Bd" 
      Property="Background" 
      Value="#3D26A0DA" /> 
    <Setter TargetName="Bd" 
      Property="BorderBrush" 
      Value="#FF26A0DA" /> 
</MultiTrigger> 

触发器的选择状态不再正在申请刷,我们可以在骑容易,但一成不变的颜色。因此,要修改它,您将需要派生模板并修改触发器。到White

这是ListBoxItem

<Style x:Key="ListBoxItemStyle1" 
     TargetType="{x:Type ListBoxItem}"> 
    <Setter Property="SnapsToDevicePixels" 
      Value="True" /> 
    <Setter Property="Padding" 
      Value="4,1" /> 
    <Setter Property="HorizontalContentAlignment" 
      Value="{Binding HorizontalContentAlignment, 
          RelativeSource={RelativeSource FindAncestor, 
                 AncestorLevel=1, 
                 AncestorType={x:Type ItemsControl}}}" /> 
    <Setter Property="VerticalContentAlignment" 
      Value="{Binding VerticalContentAlignment, 
          RelativeSource={RelativeSource FindAncestor, 
                 AncestorLevel=1, 
                 AncestorType={x:Type ItemsControl}}}" /> 
    <Setter Property="Background" 
      Value="Transparent" /> 
    <Setter Property="BorderBrush" 
      Value="Transparent" /> 
    <Setter Property="BorderThickness" 
      Value="1" /> 
    <Setter Property="FocusVisualStyle"> 
    <Setter.Value> 
     <Style> 
     <Setter Property="Control.Template"> 
      <Setter.Value> 
      <ControlTemplate> 
       <Rectangle Margin="2" 
         SnapsToDevicePixels="True" 
         Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" 
         StrokeDashArray="1 2" 
         StrokeThickness="1" /> 
      </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     </Style> 
    </Setter.Value> 
    </Setter> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
     <Border x:Name="Bd" 
       Background="{TemplateBinding Background}" 
       BorderBrush="{TemplateBinding BorderBrush}" 
       BorderThickness="{TemplateBinding BorderThickness}" 
       Padding="{TemplateBinding Padding}" 
       SnapsToDevicePixels="True"> 
      <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
          Content="{TemplateBinding Content}" 
          ContentStringFormat="{TemplateBinding ContentStringFormat}" 
          ContentTemplate="{TemplateBinding ContentTemplate}" 
          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
     </Border> 
     <ControlTemplate.Triggers> 
      <MultiTrigger> 
      <MultiTrigger.Conditions> 
       <Condition Property="IsMouseOver" 
         Value="True" /> 
      </MultiTrigger.Conditions> 
      <Setter TargetName="Bd" 
        Property="Background" 
        Value="#1F26A0DA" /> 
      <Setter TargetName="Bd" 
        Property="BorderBrush" 
        Value="#A826A0DA" /> 
      </MultiTrigger> 
      <MultiTrigger> 
      <MultiTrigger.Conditions> 
       <Condition Property="Selector.IsSelectionActive" 
         Value="False" /> 
       <Condition Property="IsSelected" 
         Value="True" /> 
      </MultiTrigger.Conditions> 
      <Setter TargetName="Bd" 
        Property="Background" 
        Value="#3DDADADA" /> 
      <Setter TargetName="Bd" 
        Property="BorderBrush" 
        Value="#FFDADADA" /> 
      </MultiTrigger> 
      <MultiTrigger> 
      <MultiTrigger.Conditions> 
       <Condition Property="Selector.IsSelectionActive" 
         Value="True" /> 
       <Condition Property="IsSelected" 
         Value="True" /> 
      </MultiTrigger.Conditions> 
      <Setter TargetName="Bd" 
        Property="Background" 
        Value="#3D26A0DA" /> 
      <Setter TargetName="Bd" 
        Property="BorderBrush" 
        Value="#FF26A0DA" /> 
      </MultiTrigger> 
      <Trigger Property="IsEnabled" 
        Value="False"> 
      <Setter TargetName="Bd" 
        Property="TextElement.Foreground" 
        Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" /> 
      </Trigger> 
     </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

通过VS2012的Windows 8给予了充分的风格,如果你修改这些触发器:

<MultiTrigger> 
    <MultiTrigger.Conditions> 
    <Condition Property="Selector.IsSelectionActive" 
       Value="False" /> 
    <Condition Property="IsSelected" 
       Value="True" /> 
    </MultiTrigger.Conditions> 
    <Setter TargetName="Bd" 
      Property="Background" 
      Value="White" /> 
    <Setter TargetName="Bd" 
      Property="BorderBrush" 
      Value="White" /> 
</MultiTrigger> 
<MultiTrigger> 
    <MultiTrigger.Conditions> 
    <Condition Property="Selector.IsSelectionActive" 
       Value="True" /> 
    <Condition Property="IsSelected" 
       Value="True" /> 
    </MultiTrigger.Conditions> 
    <Setter TargetName="Bd" 
      Property="Background" 
      Value="White" /> 
    <Setter TargetName="Bd" 
      Property="BorderBrush" 
      Value="White" /> 
</MultiTrigger> 

你应该把你的问题排序。

+0

非常感谢。让我做一些研究,从模板中派生出来,并确保它能够工作,因为我确信它会这样做,并将其标记为已回答。 –

+1

@RobGoodwin您的欢迎。您可以从https://www.dropbox.com/s/4ni0dbcgzji5h8n/ListBoxSelectionWin8.rar下载我为您的问题放在一起的样本,以查看样式覆盖。 – Viv

+0

工作。感谢您花时间发布样本。它使我能够快速测试Windows 7和8,并且为我学习WPF控件的样式提供了更多资源。 –

0

所以你只是想让选定项目的背景变白?

您的代码减去ControlBrushKey设置的工作对我来说:

<Style.Resources> 
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="White" /> 
</Style.Resources> 
+0

有趣,所以看完这个我把我的应用程序在Windows 7盒和它的工作如预期。但在我的Windows 8机器上却没有。 –

+0

对,它可以很好地工作在windows前.Net 4.5但是由于原因不可思议,触发器的值从系统画笔变为动态资源的硬编码颜色值。因此,覆盖这些资源将不再影响ListBox。我假设其他控件的情况类似,但我只在ListBox上验证过它。 – MojoFilter

1

添加以下触发到我的项目的DataTemplate,工作于Windows 10:

<DataTemplate x:Key="MyItemTemplate"> 
    <Border Name="Border" Background="Transparent" BorderBrush="LightGray" BorderThickness="0,1,0,0" Padding="0"> 
     <TextBlock Text="{Binding Text}" HorizontalAlignment="Left" FontWeight="Medium" /> 
    </Border> 
    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Value="True"> 
      <Setter TargetName="Border" Property="Background" Value="SkyBlue"/> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate>