WPF 组合框禁用背景颜色

Posted

技术标签:

【中文标题】WPF 组合框禁用背景颜色【英文标题】:WPF combobox disabled background color 【发布时间】:2011-07-26 06:16:00 【问题描述】:

当 IsEnabled 设置为 False 时,WPF 组合框的背景颜色似乎不可覆盖。设置 Foreground 属性确实可以正常工作。即使使用 snoop 并设置背景也不会更改禁用状态下的组合框背景颜色。这是我正在使用的样式(基于 Blend 的模板副本)。有什么想法吗?

<!-- COMBO BOX-->
    <Style x:Key="ComboBoxFocusVisual">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate>
                    <Rectangle Margin="4,4,21,4" SnapsToDevicePixels="true" Stroke="DynamicResource x:Static SystemColors.ControlTextBrushKey" StrokeThickness="1" StrokeDashArray="1 2"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0">
        <GradientStop Color="#F3F3F3" Offset="0"/>
        <GradientStop Color="#EBEBEB" Offset="0.5"/>
        <GradientStop Color="#DDDDDD" Offset="0.5"/>
        <GradientStop Color="#CDCDCD" Offset="1"/>
    </LinearGradientBrush>
    <SolidColorBrush x:Key="ButtonNormalBorder" Color="#FF707070"/>
    <Geometry x:Key="DownArrowGeometry">M 0 0 L 3.5 4 L 7 0 Z</Geometry>
    <Style x:Key="ComboBoxReadonlyToggleButton" TargetType="x:Type ToggleButton">
        <Setter Property="OverridesDefaultStyle" Value="true"/>
        <Setter Property="IsTabStop" Value="false"/>
        <Setter Property="Focusable" Value="false"/>
        <Setter Property="ClickMode" Value="Press"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="x:Type ToggleButton">
                    <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" BorderBrush="TemplateBinding BorderBrush" Background="TemplateBinding Background" RenderMouseOver="TemplateBinding IsMouseOver" RenderPressed="TemplateBinding IsPressed" SnapsToDevicePixels="true">
                        <Grid HorizontalAlignment="Right" Width="DynamicResource x:Static SystemParameters.VerticalScrollBarWidthKey">
                            <Path x:Name="Arrow" Data="StaticResource DownArrowGeometry" Fill="Black" HorizontalAlignment="Center" Margin="3,1,0,0" VerticalAlignment="Center"/>
                        </Grid>
                    </Microsoft_Windows_Themes:ButtonChrome>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsChecked" Value="true">
                            <Setter Property="RenderPressed" TargetName="Chrome" Value="true"/>
                        </Trigger>
                        <!-- This controls the down arrow in the disabled state-->
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Visibility" TargetName="Arrow" Value="Collapsed"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <LinearGradientBrush x:Key="TextBoxBorder" EndPoint="0,20" MappingMode="Absolute" StartPoint="0,0">
        <GradientStop Color="#ABADB3" Offset="0.05"/>
        <GradientStop Color="#E2E3EA" Offset="0.07"/>
        <GradientStop Color="#E3E9EF" Offset="1"/>
    </LinearGradientBrush>
    <Style x:Key="ComboBoxEditableTextBox" TargetType="x:Type TextBox">
        <Setter Property="OverridesDefaultStyle" Value="true"/>
        <Setter Property="AllowDrop" Value="true"/>
        <Setter Property="MinWidth" Value="0"/>
        <Setter Property="MinHeight" Value="0"/>
        <Setter Property="FocusVisualStyle" Value="x:Null"/>
        <Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
        <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="x:Type TextBox">
                    <ScrollViewer x:Name="PART_ContentHost" Background="Transparent" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style x:Key="ComboBoxToggleButton" TargetType="x:Type ToggleButton">
        <Setter Property="OverridesDefaultStyle" Value="true"/>
        <Setter Property="IsTabStop" Value="false"/>
        <Setter Property="Focusable" Value="false"/>
        <Setter Property="ClickMode" Value="Press"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="x:Type ToggleButton">
                    <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" BorderBrush="TemplateBinding BorderBrush" Background="TemplateBinding Background" RenderMouseOver="TemplateBinding IsMouseOver" RenderPressed="TemplateBinding IsPressed" RoundCorners="false" SnapsToDevicePixels="true" Width="DynamicResource x:Static SystemParameters.VerticalScrollBarWidthKey">
                        <Path x:Name="Arrow" Data="StaticResource DownArrowGeometry" Fill="Black" HorizontalAlignment="Center" Margin="0,1,0,0" VerticalAlignment="Center"/>
                    </Microsoft_Windows_Themes:ButtonChrome>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsChecked" Value="true">
                            <Setter Property="RenderPressed" TargetName="Chrome" Value="true"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Fill" TargetName="Arrow" Value="#AFAFAF"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <ControlTemplate x:Key="ComboBoxEditableTemplate" TargetType="x:Type ComboBox">
        <Grid x:Name="Placement" SnapsToDevicePixels="true">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <Popup x:Name="PART_Popup" AllowsTransparency="true" Grid.ColumnSpan="2" IsOpen="Binding IsDropDownOpen, RelativeSource=RelativeSource TemplatedParent" PopupAnimation="DynamicResource x:Static SystemParameters.ComboBoxPopupAnimationKey" Placement="Bottom">
                <Microsoft_Windows_Themes:SystemDropShadowChrome x:Name="Shdw" Color="Transparent" MaxHeight="TemplateBinding MaxDropDownHeight" MinWidth="Binding ActualWidth, ElementName=Placement">
                    <Border x:Name="DropDownBorder" BorderBrush="DynamicResource x:Static SystemColors.WindowFrameBrushKey" BorderThickness="1" Background="DynamicResource x:Static SystemColors.WindowBrushKey">
                        <ScrollViewer x:Name="DropDownScrollViewer">
                            <Grid RenderOptions.ClearTypeHint="Enabled">
                                <Canvas HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0">
                                    <Rectangle x:Name="OpaqueRect" Fill="Binding Background, ElementName=DropDownBorder" Height="Binding ActualHeight, ElementName=DropDownBorder" Width="Binding ActualWidth, ElementName=DropDownBorder"/>
                                </Canvas>
                                <ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Contained" SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels"/>
                            </Grid>
                        </ScrollViewer>
                    </Border>
                </Microsoft_Windows_Themes:SystemDropShadowChrome>
            </Popup>
            <Microsoft_Windows_Themes:ListBoxChrome x:Name="Border" BorderBrush="TemplateBinding BorderBrush" BorderThickness="TemplateBinding BorderThickness" Background="TemplateBinding Background" Grid.ColumnSpan="2" RenderMouseOver="TemplateBinding IsMouseOver" RenderFocused="TemplateBinding IsKeyboardFocusWithin"/>
            <TextBox x:Name="PART_EditableTextBox" HorizontalContentAlignment="TemplateBinding HorizontalContentAlignment" IsReadOnly="Binding IsReadOnly, RelativeSource=RelativeSource TemplatedParent" Margin="TemplateBinding Padding" Style="StaticResource ComboBoxEditableTextBox" VerticalContentAlignment="TemplateBinding VerticalContentAlignment"/>
            <ToggleButton Grid.Column="1" IsChecked="Binding IsDropDownOpen, Mode=TwoWay, RelativeSource=RelativeSource TemplatedParent" Style="StaticResource ComboBoxToggleButton"/>
        </Grid>
        <ControlTemplate.Triggers>
            <Trigger Property="IsKeyboardFocusWithin" Value="true">
                <Setter Property="Foreground" Value="Black"/>
            </Trigger>
            <Trigger Property="IsDropDownOpen" Value="true">
                <Setter Property="RenderFocused" TargetName="Border" Value="true"/>
            </Trigger>
            <Trigger Property="HasItems" Value="false">
                <Setter Property="Height" TargetName="DropDownBorder" Value="95"/>
            </Trigger>
            <Trigger Property="IsEnabled" Value="false">
                <Setter Property="Foreground" Value="DynamicResource x:Static SystemColors.GrayTextBrushKey"/>
                <Setter Property="Background" Value="#FFF4F4F4"/>
            </Trigger>
            <Trigger Property="IsGrouping" Value="true">
                <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
            </Trigger>
            <Trigger Property="HasDropShadow" SourceName="PART_Popup" Value="true">
                <Setter Property="Margin" TargetName="Shdw" Value="0,0,5,5"/>
                <Setter Property="Color" TargetName="Shdw" Value="#71000000"/>
            </Trigger>
            <Trigger Property="ScrollViewer.CanContentScroll" SourceName="DropDownScrollViewer" Value="false">
                <Setter Property="Canvas.Top" TargetName="OpaqueRect" Value="Binding VerticalOffset, ElementName=DropDownScrollViewer"/>
                <Setter Property="Canvas.Left" TargetName="OpaqueRect" Value="Binding HorizontalOffset, ElementName=DropDownScrollViewer"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
    <Style x:Key="ComboBoxStyle1" TargetType="x:Type ComboBox">
        <Setter Property="FocusVisualStyle" Value="StaticResource ComboBoxFocusVisual"/>
        <Setter Property="Foreground" Value="DynamicResource x:Static SystemColors.WindowTextBrushKey"/>
        <Setter Property="Background" Value="StaticResource ButtonNormalBackground"/>
        <Setter Property="BorderBrush" Value="StaticResource ButtonNormalBorder"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
        <Setter Property="Padding" Value="4,3"/>
        <Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
        <Setter Property="ScrollViewer.PanningMode" Value="Both"/>
        <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="x:Type ComboBox">
                    <Grid x:Name="MainGrid" SnapsToDevicePixels="true">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition MinWidth="DynamicResource x:Static SystemParameters.VerticalScrollBarWidthKey" Width="0"/>
                        </Grid.ColumnDefinitions>
                        <Popup x:Name="PART_Popup" AllowsTransparency="true" Grid.ColumnSpan="2" IsOpen="Binding IsDropDownOpen, RelativeSource=RelativeSource TemplatedParent" Margin="1" PopupAnimation="DynamicResource x:Static SystemParameters.ComboBoxPopupAnimationKey" Placement="Bottom">
                            <Microsoft_Windows_Themes:SystemDropShadowChrome x:Name="Shdw" Color="Transparent" MaxHeight="TemplateBinding MaxDropDownHeight" MinWidth="Binding ActualWidth, ElementName=MainGrid">
                                <Border x:Name="DropDownBorder" BorderBrush="DynamicResource x:Static SystemColors.WindowFrameBrushKey" BorderThickness="1" Background="DynamicResource x:Static SystemColors.WindowBrushKey">
                                    <ScrollViewer x:Name="DropDownScrollViewer">
                                        <Grid RenderOptions.ClearTypeHint="Enabled">
                                            <Canvas HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0">
                                                <Rectangle x:Name="OpaqueRect" Fill="Binding Background, ElementName=DropDownBorder" Height="Binding ActualHeight, ElementName=DropDownBorder" Width="Binding ActualWidth, ElementName=DropDownBorder"/>
                                            </Canvas>
                                            <ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Contained" SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels"/>
                                        </Grid>
                                    </ScrollViewer>
                                </Border>
                            </Microsoft_Windows_Themes:SystemDropShadowChrome>
                        </Popup>
                        <ToggleButton BorderBrush="TemplateBinding BorderBrush" Background="TemplateBinding Background" Grid.ColumnSpan="2" IsChecked="Binding IsDropDownOpen, Mode=TwoWay, RelativeSource=RelativeSource TemplatedParent" Style="StaticResource ComboBoxReadonlyToggleButton"/>
                        <ContentPresenter ContentTemplate="TemplateBinding SelectionBoxItemTemplate" ContentTemplateSelector="TemplateBinding ItemTemplateSelector" Content="TemplateBinding SelectionBoxItem" ContentStringFormat="TemplateBinding SelectionBoxItemStringFormat" HorizontalAlignment="TemplateBinding HorizontalContentAlignment" IsHitTestVisible="false" Margin="TemplateBinding Padding" SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels" VerticalAlignment="TemplateBinding VerticalContentAlignment"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="HasDropShadow" SourceName="PART_Popup" Value="true">
                            <Setter Property="Margin" TargetName="Shdw" Value="0,0,5,5"/>
                            <Setter Property="Color" TargetName="Shdw" Value="#71000000"/>
                        </Trigger>
                        <Trigger Property="HasItems" Value="false">
                            <Setter Property="Height" TargetName="DropDownBorder" Value="95"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <!-- Text color for disabled state-->
                            <Setter Property="Foreground" Value="DynamicResource x:Static SystemColors.WindowTextBrushKey"/>
                            <!-- Backround not working, something must be overriding it
                            <Setter Property="Background" Value="DynamicResource x:Static SystemColors.WindowBrushKey"/>
                            -->
                        </Trigger>
                        <Trigger Property="IsGrouping" Value="true">
                            <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                        </Trigger>
                        <Trigger Property="ScrollViewer.CanContentScroll" SourceName="DropDownScrollViewer" Value="false">
                            <Setter Property="Canvas.Top" TargetName="OpaqueRect" Value="Binding VerticalOffset, ElementName=DropDownScrollViewer"/>
                            <Setter Property="Canvas.Left" TargetName="OpaqueRect" Value="Binding HorizontalOffset, ElementName=DropDownScrollViewer"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsEditable" Value="true">
                <Setter Property="BorderBrush" Value="StaticResource TextBoxBorder"/>
                <Setter Property="Background" Value="DynamicResource x:Static SystemColors.WindowBrushKey"/>
                <Setter Property="IsTabStop" Value="false"/>
                <Setter Property="Padding" Value="3"/>
                <Setter Property="Template" Value="StaticResource ComboBoxEditableTemplate"/>
            </Trigger>
        </Style.Triggers>
    </Style>

【问题讨论】:

我已在microsoft connect site 上留下反馈,供以后的读者参考 这不是一个完整的答案,但我认为它说明了为什么会发生这种情况:***.com/questions/4424699/…。 ComboBox 在其模板中使用 ToggleButton,而 ToggleButton 又使用 ButtonChrome,这是链接中解决的问题。 【参考方案1】:

相关:WPF ComboBox: background color when disabled

【讨论】:

【参考方案2】:

取决于“不可覆盖”的含义。模板中的这个触发器:

<Trigger Property="IsEnabled" Value="false">
    <Setter Property="Foreground" Value="DynamicResource x:Static SystemColors.GrayTextBrushKey"/>
    <Setter Property="Background" Value="#FFF4F4F4"/>
</Trigger>

是设置背景。因此,您必须重写模板才能对其进行自定义 - 控件本身没有属性可以用于在禁用时设置背景,并且没有资源查找,因此您也无法在那里更改它。

【讨论】:

我试过改变它,它没有效果。如果您不相信我,请尝试一下。还是我理解错了? Adam 是对的,如果您在 setter 中更改 Background 值,则没有明显差异。 有几个 IsEnabled 触发器(我可能复制了错误的一个)。你试过正确的吗? 我都试过了。就像我之前提到的,请随时证明我错了。

以上是关于WPF 组合框禁用背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

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

更改组合框的背景颜色,它根本不改变颜色

WINAPI - 设置组合框下拉菜单的背景和文本颜色

如何通过Powershell代码更改特定WPF列表框项的背景颜色?

WPF comboboxitem 前景色改变

在 MFC 中更改组合框的项目背景颜色?