IsEnabled="False" 状态的 WPF 文本框未应用正确的背景颜色

Posted

技术标签:

【中文标题】IsEnabled="False" 状态的 WPF 文本框未应用正确的背景颜色【英文标题】:WPF TextBox in IsEnabled="False" state is not applying correct background color 【发布时间】:2017-08-01 21:39:52 【问题描述】:

当我的文本框被禁用时,我在将颜色应用到文本框时遇到问题,

acctualy 我有数据网格,我用"#E0E4E5" 颜色为行着色。我想在我的文本框被禁用时保留它的颜色,比如行的颜色是 ("#E0E4E5")。

接下来我做的是:

我将属性设置为行AlternatingRowBackground="#E0E4E5",然后我将此颜色作为行的背景颜色。

在那之后,我为我的文本框制作了样式,因为 wpf 中的默认样式看起来不太好,它有一些阴影等,所以这是我为文本框自定义的样式:

  <Style x:Key="TextBoxStyle1" TargetType="x:Type TextBox">
        <Style.Triggers>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Background" Value="#E0E4E5" />
                <Setter Property="BorderBrush" Value="#E0E4E5" />
                <Setter Property="BorderThickness" Value="1.5" />
            </Trigger>
        </Style.Triggers>

        <Setter Property="BorderBrush" Value="#0091EA"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Foreground" Value="DynamicResource x:Static SystemColors.WindowTextBrushKey"/>
        <Setter Property="Background" Value="DynamicResource x:Static SystemColors.WindowBrushKey"/>
        <Setter Property="Padding" Value="1"/>
        <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
        <Setter Property="HorizontalContentAlignment" Value="Left"/>
        <Setter Property="FocusVisualStyle" Value="x:Null"/>
        <Setter Property="AllowDrop" Value="true"/>
        <Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
        <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="x:Type TextBox">
                    <Border x:Name="Bd" BorderBrush="TemplateBinding BorderBrush" BorderThickness="TemplateBinding BorderThickness"
                                    Background="TemplateBinding Background" SnapsToDevicePixels="True">
                        <ScrollViewer x:Name="PART_ContentHost"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Background" TargetName="Bd" Value="DynamicResource x:Static SystemColors.ControlBrushKey"/>
                            <Setter Property="Foreground" Value="DynamicResource x:Static SystemColors.GrayTextBrushKey"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

正如你所看到的,有一段代码(触发器)说好的,当你被禁用时,让你的背景颜色是这样的,而边框是这样的:

<Style.Triggers>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Background" Value="#E0E4E5" />
                <Setter Property="BorderBrush" Value="#E0E4E5" />
                <Setter Property="BorderThickness" Value="1.5" />
            </Trigger>
        </Style.Triggers>

所以这里是它的外观示例:

可能会看到我对它们都应用了相同的颜色“#E0E4E5”,但不知不觉它们是不同的,所以当我的文本框禁用它成为“#E0E4E5”

我还必须注意,如果我更改边框画笔的颜色,它会起作用。例如,当它们被禁用时,我将它们都设置为文本框并将边框刷设置为红色,我得到了这个:

所以边框画笔改变了,但背景没有。

谢谢各位, 干杯

【问题讨论】:

【参考方案1】:

删除ControlTemplate 中的Setter,当TextBox 被禁用时将Background 设置为SystemColors.ControlBrushKey

<Style x:Key="TextBoxStyle1" TargetType="x:Type TextBox">
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Background" Value="#E0E4E5" />
            <Setter Property="BorderBrush" Value="#E0E4E5" />
            <Setter Property="BorderThickness" Value="1.5" />
        </Trigger>
    </Style.Triggers>

    <Setter Property="BorderBrush" Value="#0091EA"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="Foreground" Value="DynamicResource x:Static SystemColors.WindowTextBrushKey"/>
    <Setter Property="Background" Value="DynamicResource x:Static SystemColors.WindowBrushKey"/>
    <Setter Property="Padding" Value="1"/>
    <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
    <Setter Property="HorizontalContentAlignment" Value="Left"/>
    <Setter Property="FocusVisualStyle" Value="x:Null"/>
    <Setter Property="AllowDrop" Value="true"/>
    <Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
    <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="x:Type TextBox">
                <Border x:Name="Bd" BorderBrush="TemplateBinding BorderBrush" BorderThickness="TemplateBinding BorderThickness"
                                    Background="TemplateBinding Background" SnapsToDevicePixels="True">
                    <ScrollViewer x:Name="PART_ContentHost"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="DynamicResource x:Static SystemColors.GrayTextBrushKey"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

【讨论】:

当我看到 wpf 上帝在评论时,我知道会有非常棒的观察。非常感谢人! :)

以上是关于IsEnabled="False" 状态的 WPF 文本框未应用正确的背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

使用imageView外观禁用UIButton而不将isEnabled设置为false

当控件的 IsEnabled 为 false 时如何设置通常的背景 [关闭]

WPF IsEnabled 和 IsHitTestVisible

使带有 imageView 的 UIButton 看起来被禁用而不将 isEnabled 设置为 false

当 ArrayAdapter.isEnabled 返回 false 时,ListView 中的分隔符消失

在 UIControl 中覆盖 isEnabled 以仍然允许触摸