Изменить цвет фона для выбранного элемента ListBox - PullRequest
59 голосов
/ 26 января 2010

Это мой XAML.

    <ScrollViewer Grid.Column="1" Grid.RowSpan="2">

        <ListBox   Background="Black" ItemsSource="{Binding Path=ActiveLog}" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Background="Black">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="200"></ColumnDefinition>
                            <ColumnDefinition Width="*"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition></RowDefinition>
                            <RowDefinition></RowDefinition>
                        </Grid.RowDefinitions>
                        <TextBlock Grid.Column="0" Grid.Row="0" Foreground="White">
                            <TextBlock >Date:</TextBlock>
                            <TextBlock  Text="{Binding Path=LogDate}"/>
                        </TextBlock>
                        <TextBlock Grid.Column="1" Grid.Row="0" Foreground="White">
                            <TextBlock >Severity:</TextBlock>
                            <TextBlock  Text="{Binding Path=Severity}"/>
                        </TextBlock>
                        <TextBlock Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1" Foreground="LightGray" Text="{Binding Path=Message}"></TextBlock>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
            <ListBox.Template>
                <ControlTemplate>
                    <StackPanel Background="Black" IsItemsHost="True" >
                    </StackPanel>
                </ControlTemplate>
            </ListBox.Template>

        </ListBox>
    </ScrollViewer>

Единственная проблема заключается в том, что выбранный элемент имеет синее поле справа. Я предполагаю, что есть способ изменить цвет выделения, но я не могу его найти.

Ответы [ 6 ]

70 голосов
/ 26 января 2010
<UserControl.Resources>
    <Style x:Key="myLBStyle" TargetType="{x:Type ListBoxItem}">
        <Style.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
                             Color="Transparent"/>
        </Style.Resources>
    </Style>
</UserControl.Resources> 

и

<ListBox ItemsSource="{Binding Path=FirstNames}"
         ItemContainerStyle="{StaticResource myLBStyle}">  

Вы просто переопределяете стиль элемента списка (см .: TargetType is ListBoxItem)

50 голосов
/ 26 июля 2011

Или вы можете применить HighlightBrushKey непосредственно к ListBox. Setter Property = "Background" Value = "Transparent" НЕ работал. Но я должен был установить передний план на черный.

    <ListBox  ... >
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True" >
                        <Setter Property="FontWeight" Value="Bold" />
                        <Setter Property="Background" Value="Transparent" />
                        <Setter Property="Foreground" Value="Black" />
                    </Trigger>
                </Style.Triggers>
                <Style.Resources>
                    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/>
                </Style.Resources>
            </Style>                
        </ListBox.ItemContainerStyle>
45 голосов
/ 26 января 2010

Вам необходимо использовать ListBox.ItemContainerStyle .

ListBox.ItemTemplate определяет способ отображения содержимого элемента. Но WPF по-прежнему оборачивает каждый элемент в элемент управления ListBoxItem, который по умолчанию получает свой цвет фона, выбранный в качестве системного выделения. Вы не можете остановить WPF, создавая элементы управления ListBoxItem, но вы можете стилизовать их - в вашем случае, чтобы Задать фон всегда прозрачным или черным или как угодно - и для этого вы используете ItemContainerStyle.

ответ juFo показывает одну из возможных реализаций путем «перехвата» ресурса системной кисти фона в контексте стиля элемента; другой, возможно, более идиоматический метод - использовать Setter для свойства Background.

29 голосов
/ 24 ноября 2011

Мне нужно было установить и HighlightBrushKey, и ControlBrushKey, чтобы правильно его стилизовать. В противном случае, хотя он имеет фокус, он будет правильно использовать прозрачный HighlightBrusKey. Bt, если элемент управления теряет фокус (хотя он все еще выделен), он использует ControlBrushKey.

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

Надеюсь, это кому-нибудь поможет.

8 голосов
/ 30 мая 2015

Вы должны создать новый шаблон для выбора предметов, как это.

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="ListBoxItem">
            <Border
                BorderThickness="{TemplateBinding Border.BorderThickness}"
                Padding="{TemplateBinding Control.Padding}"
                BorderBrush="{TemplateBinding Border.BorderBrush}"
                Background="{TemplateBinding Panel.Background}"
                SnapsToDevicePixels="True">
                <ContentPresenter
                    Content="{TemplateBinding ContentControl.Content}"
                    ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
                    HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
                    VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}"
                    SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
            </Border>
        </ControlTemplate>
    </Setter.Value>
</Setter>
8 голосов
/ 14 декабря 2014

Если выбор не важен, лучше использовать ItemsControl, завернутый в ScrollViewer. Эта комбинация является более легкой, чем Listbox (который на самом деле является производным от ItemsControl), и ее использование устранит необходимость использовать дешевый хак для переопределения поведения, которое уже отсутствует в ItemsControl.

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

Вот скелет того, как должна выглядеть разметка:

    <ScrollViewer>
        <ItemsControl>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    ...
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </ScrollViewer>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...