wpf - 风格错误?无法在 Windows10 中的样式中设置背景颜色
问题描述
当我尝试为 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>
编辑:只是为了让所有评论正确,当我使用这段代码时:
<ComboBox IsEditable="True" Background="Yellow"/>
一切正常,组合框为黄色。但是当我想在 Style 中做同样的事情时 - 我应该期望这不应该工作,因为它的意图?严重地。这就是 Styles a 的用途!
解决方案
如果您编辑默认模板:
您会发现ToggleButton
您所指的 由带有硬编码的Border
(通过 设置)组成,只能由的触发器更改。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>
要启用样式,您可以将BorderBrush
和Background
属性转发到Border
through TemplateBinding
。
<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>
推荐阅读
- c# - Azure Function to Read & Write to Blob using HTTP Trigger
- python - how to get the multiple csv files on a line graph using Plotly python library to get the results on browser?
- python - Append item to Mongo Array
- javascript - 如何从值中获取“captureDate”并将其作为消息发送
- javascript - 如何在 Sentry 错误捕获上设置应用程序版本?
- wso2 - 如何在 wso2 中为用户名恢复配置自定义声明属性?
- javascript - Javascript - 在 JSON 对象中设置多个 cookie
- mysql - MySQL:看不到如何从相关表中选择 1 列的值以获取第一个表中 2 列的相关值
- mysql - Spring Boot DataSource:未指定“url”属性
- c++ - 使用 QQuickFramebufferObject 时同步数据的最佳方式是什么?