将禁用的列表框背景更改为灰色

时间:2013-04-02 20:24:24

标签: wpf background triggers listbox controltemplate

我有一个ListBox,当它被禁用时我需要变灰。根据用户请求,禁用它是不够的,但它也必须以不同的方式显示。 shrugs 我在其他几个地方看过并按照示例进行操作,看起来好像应该有效,但事实并非如此。以下是我查看的一些示例:Example1Example2

这是我的代码:

<Style x:Key="ListBoxStyle" TargetType="ListBox">
 <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBox}">
                <ControlTemplate.Triggers>
                        <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="BorderBrush" Value="Black"></Setter>
                        <Setter Property="Foreground" Value="LightGray"></Setter>
                            <Setter Property="Background" Value="LightGray"></Setter>
                        <Setter Property="BorderBrush" Value="LightGray"></Setter>
                    </Trigger>
                 </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>                 
 </Style>

看起来相当简单。我在ComboBoxTextBox上做了相同的基本流程并取得了成功。任何人都可以帮我看看我的代码错在哪里?如何正确地做到这一点的一个例子将是伟大的。上面列出的第一个例子似乎正是我所需要的,但正确的答案是“这样做的唯一方法就是覆盖模板”,这对我没有帮助。

我已经尝试了几种简单的解决方案。一些其他风格可能会影响这一点,因为我们正在使用几个不同的资源字典。有人知道什么是追踪这个问题的好方法吗?

修改 我对整个解决方案进行了搜索,而ListBox正在使用的唯一地方是我的部分,它唯一被设置样式的地方就是我设置的样式。根据{{​​3}},没有ListBox的“部分”,所以我不可能在为其他控件设置样式的过程中无意中设置了ListBox的一部分。没有样式,当我禁用ListBox时,它被冻结但没有文本可见,并且具有默认背景。当我尝试应用Property =“Background”Value =“LightGray”时,它似乎被隐藏(即没有任何东西可见)。如果有人知道为什么会这样做或如何完成我的任务,我会很感激帮助。

3 个答案:

答案 0 :(得分:10)

sa_ddam213的回答对我不起作用所以我想我会添加我发现我必须做的事情。在我的情况下,我已设置透明背景,但当我禁用该框时,它将变为灰色。我希望能够在禁用控件时控制列表框的背景,这是我发现的工作方式。

注意:对于您的情况,您需要将透明颜色更改为您想要的任何灰色阴影 注意2:这可能仅在您没有更改列表框的模板时才有效。 (更改datatemplate是好的)。

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

答案 1 :(得分:2)

我认为您不需要覆盖ControlTemplate,只需添加Style.Trigger就可以了。

示例:

   <ListBox>
        <ListBox.Style>
            <Style TargetType="{x:Type ListBox}">
                <Style.Triggers>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="Foreground" Value="LightGray" />
                        <Setter Property="Background" Value="LightGray" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ListBox.Style>
    </ListBox>

答案 2 :(得分:1)

两个答案对我来说都不是很有效,所以我找到了一种解决方案,该方案会覆盖对我有用的ControlTemplate:

            <Style TargetType="{x:Type ListBox}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ListBox}">
                            <Grid Width="Auto" Height="Auto">
                                <Border x:Name="Border" 
                                        BorderThickness="1"/>
                                <ScrollViewer Focusable="false" IsTabStop="False" HorizontalScrollBarVisibility="Disabled">
                                    <StackPanel IsItemsHost="true"/>
                                </ScrollViewer>
                            </Grid>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsEnabled" Value="false">
                                    <Setter TargetName="Border" Property="Border.Background" Value="{StaticResource DisabledBackgroundBrush}"/>
                                </Trigger>
                                <Trigger Property="IsGrouping" Value="true">
                                    <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Setter Property="Background" Value="{StaticResource DefaultBackground}"/>
            </Style>

这对我有帮助:https://social.msdn.microsoft.com/Forums/vstudio/en-US/4b033268-864e-488c-b371-80818daf7f71/can-i-override-the-disabled-background-color-for-a-listbox?forum=wpf