如何更改已禁用的组合框(或其他控件)的背景

时间:2015-02-24 21:56:03

标签: wpf

我对此进行了大量搜索并最终没有回答。

以下是我的一些搜索结果:

Setting combo box foreground color for the disabled state

WPF combobox disabled background color

WPF ComboBox: background color when disabled

有些人说它有效,但有些人说没有。我试过了,我是第一种。

那么究竟如何让它发挥作用呢?我搜索了msdn,答案是复制并粘贴标准模板然后修改它。

确定它会起作用,但我只需要改变颜色。对花生来说太复杂了。

我自己制作了一个快速自包含xaml的程序,在我的框中,它不起作用:

<Window x:Class="WpfApplication11.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ComboBox Margin="0,0,170,253">
            <ComboBox.Style>
                <Style TargetType="ComboBox">
                    <Setter Property="IsEnabled" Value="{Binding IsChecked, ElementName=tgb}"/>
                    <Style.Triggers>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Background" Value="#FF000000"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="true">
                            <Setter Property="Background" Value="#FF474747"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </ComboBox.Style>
        </ComboBox>
        <ToggleButton x:Name="tgb" Margin="347,218,10,10"/>
    </Grid>
</Window>
单击切换按钮时,

IsEnabled切换,当禁用时,组合框应为黑色,而不是。

最令人困惑的部分是,IsEnabled上的触发器是真的有效,但是虚假的触发器不起作用。

有人可以告诉我如何解决这个问题吗?

我现在正在使用.net 4.5.1,visual studio 2013。

1 个答案:

答案 0 :(得分:0)

问题是,当VisualState更改为Disabled时,默认模板将使一个矩形可见(不透明度为0.55)位于控件之上。

<Rectangle x:Name="DisabledVisualElement" RadiusX="3" RadiusY="3" Fill="White" Opacity="0" IsHitTestVisible="false" />

<vsm:VisualState x:Name="Disabled">
  <Storyboard>
    <DoubleAnimation Duration="00:00:00" Storyboard.TargetName="DisabledVisualElement" Storyboard.TargetProperty="(UIElement.Opacity)" To=".55"/>
  </Storyboard>
</vsm:VisualState>

这就是为什么你的风格中的触发器没有效果。 这是默认模板的链接: ComboBox template

最好的方法是(如你所说)用你自己的方式覆盖完整的模板。您可以将默认模板复制到项目中,并更改我上面发布的代码。