2013-05-29 2 views
16

Я пытаюсь установить цвет фона выбранного объекта ListBoxItect как белый, а не системный. Я прочитал то, что мог найти здесь на SO, и следил за ними или считал, что он выполнил рекомендации там (Change background color for selected ListBox item, WPF 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) ListBox - Windows 8

Все, кажется, решают проблему, установив HighlightBrush и ControlBrush в Прозрачный для выбранного элемента. У меня есть следующий 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> 

Я бы по достоинству оценил любые подталкивания в правильном направлении.

EDIT:

После прочтения первого ответа, что он работал на них с небольшим изменением, я взял заявление, что я развивающийся на моем Windows 8 машины и выполнил его в Windows 7 VM и он работал, как ожидалось. Любые идеи о том, что нужно изменить, чтобы заставить это работать на машине Windows 8, а также на Windows 7?

ответ

39

Эти должности становятся устаревшими для Windows-8.

В Windows-8 по какой-то причине Microsoft не хочет, чтобы люди редактировали их по умолчанию 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

Это полный стиль задается VS2012 Windows-8 для 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> 

если изменить эти триггеры:

<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

Правильно, это отлично работает с pre-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> 
Смежные вопросы