简体   繁体   English

列表框 WPF 项目背景颜色

[英]Listbox WPF item background color

I want to change the background color of ListBoxItem我想更改 ListBoxItem 的背景颜色

After search I decide to use this搜索后我决定使用这个

<ListBox>
        <ListBox.Resources>
            <!-- Background of selected item when focussed -->
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
                             Color="Blue" />
            <!-- Background of selected item when not focussed -->
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}"
                             Color="Blue" />

        </ListBox.Resources>
        <TextBlock>fdfsdf1</TextBlock>
        <TextBlock>fdfsdf3</TextBlock>
        <TextBlock>fdfsdf5</TextBlock>
        <TextBlock>fdfsdf3</TextBlock>
        <TextBlock>fdfsdf4</TextBlock>
    </ListBox>

When a listboxitem is focused, the background is blue as expected, but when the selected listboxitem loses focus, the background turns gray.当listBoxItem集中时,背景是蓝色的,但是当所选的ListBoxItem失去焦点时,背景会变为灰色。 How can I make the background remain blue when it loses focus?失去焦点时如何使背景保持蓝色?

if you mean just when its selected but inactive try InactiveSelectionHighlightBrushKey 如果您的意思是仅当其处于选中状态但不活动时,请尝试InactiveSelectionHighlightBrushKey

    <ListBox.Resources>
        <!-- Background of selected item when focussed -->
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
                         Color="Blue" />
        <!-- Background of selected item when not focussed -->
        <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}"
                         Color="Blue" />

    </ListBox.Resources>

Try this 尝试这个

<ListBox>
        <ListBox.Resources>
            <Style TargetType="ListBoxItem">
                <Setter Property="Background" Value="Blue" />
            </Style>
        </ListBox.Resources>
        <TextBlock>fdfsdf1</TextBlock>
        <TextBlock>fdfsdf3</TextBlock>
        <TextBlock>fdfsdf5</TextBlock>
        <TextBlock>fdfsdf3</TextBlock>
        <TextBlock>fdfsdf4</TextBlock>
    </ListBox>

if you think the system color keys are not working for you then you can force it by creating new style for ListboxItems as like below. 如果您认为系统颜色键不适合您,则可以通过如下所示为ListboxItems创建新样式来强制使用它。

        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="Background" Value="Silver"/>
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Background" Value="Red"/>
                </Trigger>
            </Style.Triggers>
        </Style>

This is what I used to select the color for the active/inactive items of a ListBox: 这就是我用来为ListBox的活动/非活动项目选择颜色的方法:

<ListBox Name="lbExample" SelectionMode="Multiple">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <...>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <ListBox.Resources>
            <!-- Background of selected item when not focussed -->
            <Style TargetType="{x:Type ListBoxItem}">
                <Setter Property="Background" Value="AntiqueWhite" />
            </Style>

            <!-- Background of selected item when focussed -->
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightGreen" />
    </ListBox.Resources>
</ListBox>

I'm using MaterialDesignThemes and Caliburn Micro to make a ListBox that can have multiple selections.我正在使用 MaterialDesignThemes 和 Caliburn Micro 制作一个可以有多个选择的 ListBox。 None of these other answers worked.这些其他答案都没有奏效。 What did work for me was in the ViewModel.xaml:对我有用的是 ViewModel.xaml:

<ListBox Padding="2" Margin="5" Grid.Column="1" Grid.Row="4" Name="Field1Items" SelectionMode="Multiple" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.ItemContainerStyle>
            <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                <Setter Property="Background" Value="{Binding ListBoxItemBackground}" />
            </Style>
        </ListBox.ItemContainerStyle>
</ListBox>

Then having this class to encapsulate all my items:然后让这个 class 封装我所有的项目:

public class MultiSelectItem : PropertyChangedBase
{
    public MultiSelectItem (string name)
    {
        this.Name = name;
        _isSelected = false;
    }

    public string Name { get; set; }

    bool _isSelected;
    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            _isSelected = value;
            NotifyOfPropertyChange(() => IsSelected);
            NotifyOfPropertyChange(() => ListBoxItemBackground);
        }
    }

    public string ListBoxItemBackground
    {
        get
        {
            if (IsSelected)
                return "#e0e0e0";
            return "Transparent";
        }
    }


    public override string ToString()
    {
        return Name;
    }
}

and in the ViewModelClass:在 ViewModelClass 中:

public BindableCollection<MultiSelectItem> Field1Items
{
    get
    {
        return _field1Items;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM