Подтвердить что ты не робот

Изменение цвета фона для выбранного элемента ListBox

Это мой 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>

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Вы просто переопределяете стиль listboxitem (см.: TargetType - ListBoxItem)

Ответ 3

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

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

Ответ 4

Мне нужно было установить и 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>

При использовании .Net 4.5 и выше используйте InactiveSelectionHighlightBrushKey вместо ControlBrushKey:

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

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

Ответ 5

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

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

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

    <ScrollViewer>
        <ItemsControl>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    ...
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </ScrollViewer>

Ответ 6

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

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

Ответ 7

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

Этот код работал как прелесть для меня. Благодаря оригинальному плакату.