2013-05-29 15 views
16

Próbuję ustawić kolor tła wybranego obiektu ListBoxItem na biały zamiast koloru systemu. Przeczytałem, co mogłem znaleźć na SO i śledziłem lub uważałem, że postępowałem zgodnie z zaleceniami tam (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 i innych).Ustawianie koloru tła lub WPF (4.0) ListBox - Windows 8

Wszystko wydaje się rozwiązać problem, ustawiając HighlightBrush i ControlBrush na Transparent dla wybranego elementu. Mam następujące XAML i ustawia poprawnie kolor czcionki, ale backgroound jest domyślnym przezroczystym niebieskim, niezależnie od ustawień pędzla. Wciąż jestem trochę noobem WPF, więc muszę tu pominąć coś prostego.

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

Byłbym wdzięczny za wszelkie kłucie w dobrym kierunku.

EDIT:

Po przeczytaniu pierwszej odpowiedzi, że pracował dla nich z niewielką zmianą, wziąłem wniosku, że rozwijają się w moim systemie Windows 8 maszynie i wykonywane go w Windows 7 VM i działało zgodnie z oczekiwaniami. Jakieś pomysły na to, co należy zmienić, aby to działało na komputerze z Windows 8, a także Windows 7?

Odpowiedz

39

Te posty są coraz nieaktualne dla Windows-8.

W Windows-8 z jakiegoś powodu Microsoft nie chce, aby ludzie edytowali swoje Domyślne Style tak łatwo lub coś z over-ride Brush.

ListBoxItem domyślny Style z VS ma to do wyboru wyzwala:

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

wyzwalacze nie dłużej stanu Selection stosujemy szczotki my CAN over-ride łatwo ale są kolory statyczne. Dlatego aby go zmodyfikować, musisz wyprowadzić szablon i zmodyfikować wyzwalacz. do White

Jest to pełna Style podane przez VS2012 na Windows 8 dla 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> 

jeśli zmiany tych wyzwalaczy do:

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

powinieneś Twój problem posortowane.

+0

Dziękuję bardzo. Pozwólcie, że przeprowadzę badania nad szablonami, aby je zastąpić i upewnić się, że to działa, jak jestem pewien, że to zrobię, i oznaczy je jako odpowiedzi. –

+1

@RobGoodwin Twoje powitanie. Możesz pobrać próbkę, którą umieściłem dla twojego pytania z https://www.dropbox.com/s/4ni0dbcgift_h8n/ListBoxSelectionWin8.rar, aby zobaczyć zastąpienie stylu. – Viv

+0

To zadziałało. Dziękuję za poświęcenie czasu na opublikowanie próbki. Pozwoliło mi to szybko przetestować system Windows 7 i 8 i daje mi trochę więcej źródeł do nauki o stylowaniu elementów sterujących WPF. –

0

Po prostu chcesz, aby tło wybranego elementu było białe?

Twój minus Kodeks ControlBrushKey ustawienie działa dla mnie:

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

Ciekawe, więc po przeczytaniu tego Wziąłem mój wniosek do skrzynki Windows 7 i to działało jak oczekiwano. Ale na mojej maszynie z Windows 8 nie ma. –

+0

Dobrze, że działa świetne okno .NET 4.5 Jednak z niezrozumiałych powodów, wartości wyzwalaczy zostały zmienione z pędzli systemowych na zakodowane wartości kolorów z dynamicznymi zasobami. Więc przesłonięcie tych zasobów nie będzie już miało wpływu na ListBox.Zakładam, że sytuacja jest podobna w przypadku innych kontrolek, ale do tej pory zweryfikowałem to tylko w ListBox. – MojoFilter

1

Dodanie następującego spust do mojego poz DataTemplate, pracował dla 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> 
Powiązane problemy