У меня есть приложение WPF, которое поставляется с набором стилей по умолчанию для Label, TextBox и т. Д., Определенных типами элементов (явные ключи не определены).
В приложении используются два основных контейнера, один с темным фоном и один со светлым фоном, так что иногда бывает правильным использовать черный цвет в качестве цвета переднего плана для метки, а иногда его резко неправильно. С другой стороны, редакторы всегда стилизуются довольно традиционно со светлым фоном и темным передним планом, поэтому я не могу просто установить передний план для всех дочерних элементов в обратный.
Существует ли элегантный способ заставить мои метки (и, возможно, также 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 "), это не так.
Мне бы очень хотелось, чтобы этот стиль мог оценить «эффективный фон» (независимо от того, откуда он) и выбрать подходящую кисть переднего плана для этого фона.