項目タイプによって定義された Label、TextBox などのデフォルト スタイルのセットが付属する WPF アプリケーションがあります (明示的なキーは定義されていません)。
アプリケーション内では、暗い背景色と明るい背景色の 2 つの主要なコンテナーが使用されます。そのため、ラベルの前景色として黒を使用することが正しい場合もあれば、極端に間違っている場合もあります。一方、エディターは常に明るい背景と暗い前景というかなり伝統的なスタイルになっているため、すべての子要素の前景を逆に設定することはできません。
「自分の」背景に応じて前景色を決定するために、ラベル (およびおそらく TextBlocks も) を作成するエレガントな方法はありますか? 私は2つの色を切り替えたいだけなので、自動コントラストの最大化は必要ありません。白い地面に白いフォントを避けるためのしきい値だけです。
また、デフォルト スタイルの 2 つのセットを定義したくありません。単一の 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") 、 そうではありません。スタイルが「効果的な背景」(それがどこから来ても) を評価し、この背景に適切な前景ブラシを選択できるようにしたいと考えています。