风格错误?无法在 Windows10 中的样式中设置背景颜色

Posted

技术标签:

【中文标题】风格错误?无法在 Windows10 中的样式中设置背景颜色【英文标题】:Style Bug? Can not set Background Color within Style in Windows10 【发布时间】:2019-09-28 08:52:04 【问题描述】:

当我尝试为 ComboBox 设置 BackgroundColor 时,它在 Windows7 中运行良好,但在 Windows 10 中运行良好。这是预期的行为还是错误? 编辑:我不是指 ComboBox 弹出窗口,只是普通 ComboBox 的背景颜色。

<ComboBox IsEditable="True">
        <ComboBox.Style>
            <Style TargetType="ComboBox">
            <Setter Property="Background" Value="Yellow"></Setter>                 
            </Style>
        </ComboBox.Style>            
  </ComboBox>

编辑:只是为了让所有 cmets 正确,当我使用此代码时:

 <ComboBox IsEditable="True" Background="Yellow"/>

一切正常,组合框为黄色。但是当我想在 Style 中做同样的事情时 - 我应该期望这不应该工作,因为它是有意的?严重地。这就是 Styles a 的用途!

【问题讨论】:

这不是一个bug,这是因为ComboBox控件的默认模板在不同版本的Windows之间有所不同。 WPF Change Background color of a Combobox的可能重复 这个问题怎么还没解决?灰色组合框颜色在 Windows 10 的模板中硬编码。灰​​色位不是背景,也不是模板绑定到背景。它位于背景之上。更改背景,您将看不到任何区别,因为边框位于其顶部。您需要更改该模板。 @Andy 我只是想知道微软为什么这样做?这对我来说毫无意义。 我怀疑是否有关于模板更改的董事会会议。更有可能是设计师和开发人员。或者只是实习生。你必须找到并询问做这项工作的人。因为那可能是 9 年或 10 年前的事了,所以从事这项工作的人可能在很久以前就从 wpf 团队的剩余部分继续前进了。 【参考方案1】:

如果您编辑默认模板:

您会发现您所指的ToggleButtonBorder(通过ControlTemplate 设置)和硬编码的LinearGradientBrush 组成,只能由ControlTemplate 更改触发器。

<ControlTemplate x:Key="ComboBoxControlTemplate" TargetType="x:Type ComboBox">
    <Grid x:Name="templateRoot" 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, Mode=TwoWay, RelativeSource=RelativeSource TemplatedParent" Margin="1" PopupAnimation="DynamicResource x:Static SystemParameters.ComboBoxPopupAnimationKey" Placement="Bottom">

            <!--Left out for brevity-->

        </Popup>
        <ToggleButton x:Name="toggleButton" BorderBrush="TemplateBinding BorderBrush" BorderThickness="TemplateBinding BorderThickness" Background="TemplateBinding Background" Grid.ColumnSpan="2" IsChecked="Binding IsDropDownOpen, Mode=TwoWay, RelativeSource=RelativeSource TemplatedParent">
            <ToggleButton.Style>
                <Style 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">
                                <Border x:Name="templateRoot" BorderBrush="#FFACACAC" BorderThickness="TemplateBinding BorderThickness" SnapsToDevicePixels="True">
                                    <Border.Background>
                                            <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
                                                <GradientStop Color="#FFF0F0F0" Offset="0"/>
                                                <GradientStop Color="#FFE5E5E5" Offset="1"/>
                                            </LinearGradientBrush>
                                        </Border.Background>
                                    <Border x:Name="splitBorder" BorderBrush="Transparent" BorderThickness="1" HorizontalAlignment="Right" Margin="0" SnapsToDevicePixels="True" Width="DynamicResource x:Static SystemParameters.VerticalScrollBarWidthKey">
                                        <Path x:Name="Arrow" Data="F1M0,0L2.667,2.66665 5.3334,0 5.3334,-1.78168 2.6667,0.88501 0,-1.78168 0,0z" Fill="#FF606060" HorizontalAlignment="Center" Margin="0" VerticalAlignment="Center"/>
                                    </Border>
                                </Border>
                                <ControlTemplate.Triggers>

                                    <!--Left out for brevity-->

                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ToggleButton.Style>
        </ToggleButton>
        <ContentPresenter x:Name="contentPresenter" ContentTemplate="TemplateBinding SelectionBoxItemTemplate" Content="TemplateBinding SelectionBoxItem" ContentStringFormat="TemplateBinding SelectionBoxItemStringFormat" HorizontalAlignment="TemplateBinding HorizontalContentAlignment" IsHitTestVisible="False" Margin="TemplateBinding Padding" SnapsToDevicePixels="TemplateBinding SnapsToDevicePixels" VerticalAlignment="TemplateBinding VerticalContentAlignment"/>
    </Grid>
    <ControlTemplate.Triggers>

        <!--Left out for brevity-->

    </ControlTemplate.Triggers>
</ControlTemplate>

要启用样式,您可以将BorderBrushBackground 属性转发到BorderTemplateBinding

<ControlTemplate TargetType="x:Type ToggleButton">
    <Border x:Name="templateRoot" 
            BorderBrush="TemplateBinding BorderBrush" BorderThickness="TemplateBinding BorderThickness" 
            Background="TemplateBinding Background" SnapsToDevicePixels="True">

        <!--
        <Border.Background>
            <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
                <GradientStop Color="#FFF0F0F0" Offset="0"/>
                <GradientStop Color="#FFE5E5E5" Offset="1"/>
            </LinearGradientBrush>
        </Border.Background>
        -->

        <Border x:Name="splitBorder" BorderBrush="Transparent" BorderThickness="1" HorizontalAlignment="Right" Margin="0" SnapsToDevicePixels="True" Width="DynamicResource x:Static SystemParameters.VerticalScrollBarWidthKey">
            <Path x:Name="Arrow" Data="F1M0,0L2.667,2.66665 5.3334,0 5.3334,-1.78168 2.6667,0.88501 0,-1.78168 0,0z" Fill="#FF606060" HorizontalAlignment="Center" Margin="0" VerticalAlignment="Center"/>
        </Border>
    </Border>
    <ControlTemplate.Triggers>

        <!--Left out for brevity-->

    </ControlTemplate.Triggers>
</ControlTemplate>

【讨论】:

以上是关于风格错误?无法在 Windows10 中的样式中设置背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 2015 和 Windows 10 中无法获取 XP 样式按钮 (FlatStyle=System)?

Windows 10 中的 CoCreateInstance 错误 0x80131700:无法使用 .NET 运行时 4.0

无法在Windows 10上安装ZBar for Python 2.7.9:zbar.h中的错误

WPF ContextMenu 和 MenuItem 无法在默认样式 WPF 中设置 OverridesDefaultStyle 属性

Encore Vue.js 风格编译错误文件夹

无法在android上的反应导航标题中设置阴影样式(反应本机)