我的WPF窗口将其前景画笔设置为资源字典中的画笔,我希望窗口中的所有文本都具有此颜色,因此我不会在其他任何内容中触摸前景画笔。
文本框获得颜色
文本块获得颜色
按钮获得颜色
列表框没有颜色,因此它们的内容也没有。
有没有办法让Listbox在这方面表现得像其他控件一样?
假设没有,并且这是设计原因,理由是什么?
似乎我的问题不够明确。
我了解如何创建样式和资源并将其应用于ListBox
es;我想知道为什么我需要为某些控件执行此操作时不需要其他人 - 为什么有些继承属性而其他人没有 - 以及是否有任何方法可以使它们全部以同样的方式继承。
答案 0 :(得分:8)
ListBox和其他一些控件未继承Foreground属性的原因是它使用默认样式的Setter显式重写。不幸的是,即使您为ListBox分配了一个不包含Foreground属性setter的自定义样式,它仍会在尝试继承其父级的值之前回退到使用默认样式。
确定属性值的优先顺序是:
由于#6是在控件的默认样式中定义的,因此WPF不会尝试确定#7的值。
答案 1 :(得分:1)
这是列表框项目的样式:
<Style x:Key="{x:Type ListBoxItem}" TargetType="ListBoxItem">
<Setter Property="SnapsToDevicePixels" Value="true"/>
<Setter Property="OverridesDefaultStyle" Value="true"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border
Name="Border"
Padding="2"
SnapsToDevicePixels="true">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter TargetName="Border" Property="Background"
Value="{StaticResource SelectedBackgroundBrush}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground"
Value="{StaticResource DisabledForegroundBrush}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
现在,您要做的是修改它,以便静态资源“DisabledForegroundBrush”指向您的资源画笔。将它添加到Window.Resource标记中,你应该很高兴。
答案 2 :(得分:1)
你可以这样做:
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="root">
<ListBox>
<ListBox.Resources>
<Style TargetType="{x:Type ListBox}">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Yellow"/>
<SolidColorBrush x:Key="{x:Static SystemColors.WindowTextBrushKey}" Color="Red"/>
</Style.Resources>
</Style>
</ListBox.Resources>
<ListBoxItem>Item 1</ListBoxItem>
<ListBoxItem>Item 2</ListBoxItem>
</ListBox>
</Page>
您可以使用Binding表达式绑定到为应用程序定义的颜色资源,而不是Color="Red"
。