我在我的全球字典中将TextBlock
的前景设置为白色,并且此样式也应用于Combobox
,这使得组合框选项不可读。我找不到为Windows 8或更高版本设置Combobox
背景的简单方法。所以我决定现在可以使用默认的Combobox
样式,但我似乎无法找到一个简单的解决方案。我尝试设置foreground
的{{1}},Combobox
下的样式TextBlock
和样式Combobox.Resources
但没有运气。
如果我可以将组合框的背景设置为黑色而不复制整个ComboBoxItem
的控件模板,那将是理想的选择。如果没有,那么如果我可以在我的字典中设置Combobox
的前景,那将是最好的,但我愿意接受解决方案。
编辑:包括最低范例
Dictionary1.xaml:
Combobox
的App.xaml:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1">
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="WhiteSmoke"/>
</Style>
</ResourceDictionary>
mainwindow.xaml
<Application x:Class="WpfApplication1.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Dictionary1.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
请注意,前景=黑色都不起作用。我正在使用Windows 10.
答案 0 :(得分:2)
这里的问题是你只能在无限范围内应用隐式Style on Control。对于其他元素,范围仅限于DataTemplate或ControlTemplate。这里的隐式样式是Resources
中定义的并且未指定x:Key
的内容(实际上x:Key
将隐式设置为TargetType。)
此处定位的TextBlock
是ComboBox
模板范围内的ComboBoxItem
,因此无法使用某些隐式Style或外部的某些继承样式。然而,在App的资源中定义的全局样式可以在所有元素上应用Style,如果没有任何其他覆盖。
所以你有一些选择。您可以重新模板TextBlock
,但需要更多代码。如果这不是一个选项,您可以尝试将<Setter Property="Foreground" Value="WhiteSmoke"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsEnabled,
RelativeSource={RelativeSource AncestorType=ComboBox}}" Value="True">
<Setter Property="Foreground" Value="Black"/>
</DataTrigger>
</Style.Triggers>
的全局样式应用于某些触发器,如下所示:
Trigger
ComboBox
听取TextBlock
的任何父级,如果已启用,Foreground
将采用其他样式(Black
设置为{{1} }})。当然,正如您所看到的那样,Trigger属于ResourceDictionary
中定义的样式。所有其他TextBlock
仍然具有其全局样式(Foreground
设置为WhiteSmoke
)。
无论如何,你需要在App的资源中或在同一级别覆盖ResoureDictionary
中定义的样式。 Trigger
只是一种在应用/覆盖时进行过滤的方法。
答案 1 :(得分:0)
如果您只在ComboBox中显示文字:
<Style TargetType="{x:Type ComboBox}">
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}" />
</Style>
如果要更改背景,则需要创建ControlTemplate副本。在官方的Win8和更高版本的模板中,存在一个问题 - 不是在ComboBox中而是在ToggleButton原语中。这是控件链:ComboBoxTemplate&gt; ToggleButton&gt; ToggleButtonTemplate。但是,TogglebuttonTemplate中不存在TemplateBinding
到背景和其他画笔,因此对背景的任何更改都不会传播到ToggleButton的子项。唯一的方法是创建一个控件的副本,并通过TemplateBinding ToggleButton模板连接该缺失的部分。但是,我不确定ComboBox是否会在其他版本的Windows上保留本机操作系统外观。
我尝试覆盖ToggleButton原语,但它没有ComboBox的ToggleButton使用的自定义模板。