我有一个 WPF 应用程序,它附带一组由项目类型定义的标签、文本框等默认样式(未定义显式键)。
在应用程序中,使用了两个主要容器,一个具有深色背景,一个具有浅色背景,因此有时使用黑色作为标签的前景色是正确的,有时则大错特错。另一方面,编辑器的样式总是比较传统的浅色背景和深色前景,所以我不能只将所有子元素的前景设置为相反。
有没有一种优雅的方法可以让我的标签(也许还有 TextBlocks)根据“他们的”背景来决定他们的前景色?我只想在两种颜色之间切换,因此不需要自动对比度最大化,只需要一些阈值来避免白色背景上的白色字体。
我也不想定义两组默认样式,我强烈寻找某种方法来使我的单个 Label-Default-Style 适合两种背景变体。
是否有可能(并且在没有太多性能影响的情况下可行)将触发器/绑定添加到评估当前背景颜色的样式?
或者,我会对如何为某些 FrameworkElements(尤其是容器/面板)干净地设置背景颜色而不遇到上述问题的最佳实践感兴趣。
这是我尝试过的(当然是简化的):
<UniformGrid>
<UniformGrid.Resources>
<!-- SimpleStyles: Label -->
<Style x:Key="{x:Type Label}" TargetType="{x:Type Label}">
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="VerticalContentAlignment" Value="Top"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Label}">
<Border>
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" RecognizesAccessKey="True"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="Background" Value="Black">
<Setter Property="Foreground" Value="Red"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="#888888"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UniformGrid.Resources>
<Label x:Name="bgSetExplicitly" Background="Black">abc
</Label>
<Border Background="Black">
<Label x:Name="bgInheritedFromParent" >abc
</Label>
</Border>
<Label>abc
</Label>
<Label>abc
</Label>
您可以看到标签的背景选择得很好,如果标签具有明确的背景集 (x:Name=bgSetExplicitly),但如果背景是从 VisualTree 中的父级“继承”的 (x:Name="bgInheritedFromParent") , 它不是。我希望这种风格可以评估“有效背景”(无论它来自哪里)并为此背景选择合适的前景画笔。