【问题标题】:how exactly to change the background of a disabled combobox (or other control)如何准确更改禁用组合框(或其他控件)的背景
【发布时间】:2015-02-24 21:56:03
【问题描述】:

我在这方面做了很多搜索,最终没有答案。

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

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 为 true 的触发器有效,但为 false 的触发器无效。

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

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

【问题讨论】:

    标签: wpf


    【解决方案1】:

    问题是,当 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

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

    【讨论】:

    • 谢谢。但为什么有人会说它有效?正如我所说,修改模板是我想要避免的。太多的代码太少的东西。如果必须以这种方式完成,我想把它留在那里。
    • 我不知道为什么有人这么说。但是没有其他方法可以删除覆盖的矩形。您可以简单地复制和粘贴默认模板并删除我在上面发布的代码,这不是很多工作。使用模板创建一个额外的 ResourceDictionary 并将其与 App.Resources 中的其余部分合并,这样您的工作代码就不会被弄乱。我认为这是一个简单的解决方案
    猜你喜欢
    • 1970-01-01
    • 2018-04-16
    • 2018-12-26
    • 2010-10-20
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 2019-04-16
    • 2021-11-17
    相关资源
    最近更新 更多