最简单的方式来组合组合框的前景色

时间:2015-10-14 05:38:01

标签: wpf styling

我在我的全球字典中将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.

2 个答案:

答案 0 :(得分:2)

这里的问题是你只能在无限范围内应用隐式Style on Control。对于其他元素,范围仅限于DataTemplate或ControlTemplate。这里的隐式样式是Resources中定义的并且未指定x:Key的内容(实际上x:Key将隐式设置为TargetType。)

此处定位的TextBlockComboBox模板范围内的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使用的自定义模板。