C# WPF更改列表框背景色,启用和禁用

C# WPF更改列表框背景色,启用和禁用,c#,wpf,listbox,C#,Wpf,Listbox,我正在搜索如何更改我的WPF列表框的背景色,没有任何效果。。。我不想更改项目模板的背景,只想更改列表框本身的背景。 我尝试了这里回答的不同解决方案 这是我的列表框: <ListBox Name="myListBox" ScrollViewer.VerticalScrollBarVisibility="Visible" SelectionChanged="myListBox_SelectionChanged" Background="#FFC3DDF7" Margin="0,0,0,10"&

我正在搜索如何更改我的WPF列表框的背景色,没有任何效果。。。我不想更改项目模板的背景,只想更改列表框本身的背景。
我尝试了这里回答的不同解决方案
这是我的列表框:

<ListBox Name="myListBox" ScrollViewer.VerticalScrollBarVisibility="Visible" SelectionChanged="myListBox_SelectionChanged" Background="#FFC3DDF7" Margin="0,0,0,10">
                <ListBox.ItemContainerStyle>
                    <Style TargetType="ListBoxItem">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Value.IsOk}" Value="True">
                                <Setter Property="Background" Value="Green"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ListBox.ItemContainerStyle>
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <StackPanel Width="200">
                                <TextBlock FontSize="10" FontWeight="Bold" VerticalAlignment="Center" Text="{Binding Path=Key}" />
                                <TextBlock FontSize="10" VerticalAlignment="Center" TextWrapping="Wrap">
                                    <TextBlock.Text>
                                        <MultiBinding StringFormat="{}{0} {1} {2}">
                                            <Binding Path="Value.TextA" />
                                            <Binding Path="Value.TextB" />
                                            <Binding Path="Value.TextC" />
                                        </MultiBinding>
                                    </TextBlock.Text>
                                </TextBlock>
                            </StackPanel>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

也许项目模板在前台

尝试了以下代码:

<ListBox.Style>
<Style TargetType="{x:Type ListBox}">
    <Style.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Blue"/>
    </Style.Resources>
</Style>



不工作。两个滚动条之间的右下角变成了蓝色。。。但仅此而已

链接答案不起作用的原因是您在元素本身上将列表框的背景设置为#FFC3DDF7。如果希望更改列表框的初始背景色,则需要将其移到样式中。如果不移动此项,则“最近”定义值的规则将是元素本身的规则,样式不能覆盖此规则

<ListBox Name="myListBox" ScrollViewer.VerticalScrollBarVisibility="Visible" SelectionChanged="myListBox_SelectionChanged" Margin="0,0,0,10">
        <ListBox.Style>
            <Style TargetType="{x:Type ListBox}">
                <Setter Property="Background" Value="#FFC3DDF7"/>

                <Style.Triggers>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="Foreground" Value="LightGray" />
                        <Setter Property="Background" Value="LightGray" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ListBox.Style>

        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Value.IsOk}" Value="True">
                        <Setter Property="Background" Value="Green"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ListBox.ItemContainerStyle>

        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <StackPanel Width="200">
                        <TextBlock FontSize="10" FontWeight="Bold" VerticalAlignment="Center" Text="{Binding Path=Key}" />
                        <TextBlock FontSize="10" VerticalAlignment="Center" TextWrapping="Wrap">
                            <TextBlock.Text>
                                <MultiBinding StringFormat="{}{0} {1} {2}">
                                    <Binding Path="Value.TextA" />
                                    <Binding Path="Value.TextB" />
                                    <Binding Path="Value.TextC" />
                                </MultiBinding>
                            </TextBlock.Text>
                        </TextBlock>
                    </StackPanel>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

首先—此msdn链接将为您提供最大帮助。您可以通过这种方式进行检查-什么适用于
列表框
列表框项目
中的哪个位置

如果您检查
ListBoxItem
样式
,您将看到
ContentPresenter
没有应用
前台

  <Style TargetType="ListBoxItem">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBoxItem">
                        <Grid Background="{TemplateBinding Background}">
                            <ContentPresenter   x:Name="contentPresenter"
                                                Content="{TemplateBinding Content}"
                                                ContentTemplate="{TemplateBinding ContentTemplate}"
                                                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                Margin="{TemplateBinding Padding}"/><!-- No foreground gets applied. -->
                            <Rectangle x:Name="FocusVisualElement" Stroke="#FF6DBDD1" StrokeThickness="1" Visibility="Collapsed" RadiusX="1" RadiusY="1" />
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

无论如何,以下是您的解决方案:

    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" 
                        Width="200">
                <TextBlock VerticalAlignment="Center" 
                               FontSize="10" 
                               TextWrapping="Wrap">

                        <Run FontWeight="Bold" Text="{Binding Path=Key}" />
                        <LineBreak />
                        <Run>
                            <Run.Text>
                                <MultiBinding StringFormat="{}{0} {1} {2}">
                                    <Binding Path="Value.TextA" />
                                    <Binding Path="Value.TextB" />
                                    <Binding Path="Value.TextC" />
                                </MultiBinding>
                            </Run.Text>
                        </Run>
                    <TextBlock.Style>
                        <Style TargetType="{x:Type TextBlock}">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding IsOk}" Value="True" >
                                    <Setter Property="Foreground" Value="Green"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </TextBlock.Style>
                </TextBlock>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>


TextBlock
现在侦听
isOk
,并将应用
前景

,正如Anthony指出的,样式触发器永远不会设置列表框的背景,因为您已经设置了本地值。它被称为“依赖属性优先”。请查看此链接:


“本地”值的优先级高于“样式触发器”值。但是,“样式触发器”值的优先级高于“样式设置器”值。这意味着,如果您想为属性设置初始值并根据触发器对其进行更改,只需将其初始设置为样式,而不是像代码那样在本地进行设置。

可能重复Not relater,在答案上链接列表框项目,我的问题是列表框本身。你在哪里试图更改它?我在这里只看到项目的样式…我将通过尝试改变我的问题
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" 
                        Width="200">
                <TextBlock VerticalAlignment="Center" 
                               FontSize="10" 
                               TextWrapping="Wrap">

                        <Run FontWeight="Bold" Text="{Binding Path=Key}" />
                        <LineBreak />
                        <Run>
                            <Run.Text>
                                <MultiBinding StringFormat="{}{0} {1} {2}">
                                    <Binding Path="Value.TextA" />
                                    <Binding Path="Value.TextB" />
                                    <Binding Path="Value.TextC" />
                                </MultiBinding>
                            </Run.Text>
                        </Run>
                    <TextBlock.Style>
                        <Style TargetType="{x:Type TextBlock}">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding IsOk}" Value="True" >
                                    <Setter Property="Foreground" Value="Green"/>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </TextBlock.Style>
                </TextBlock>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>