次の状況があります(簡略化):
ResourceDictionary で、Label の名前付きスタイルをいくつか定義しました。
<Style
x:Key="sNormalLabel"
TargetType="Label" >
<Setter Property="FontFamily" Value="Verdana" />
<Setter Property="FontSize" Value="12" />
<!-- ... -->
</Style>
<Style
x:Key="sHeaderLabel"
TargetType="Label"
BasedOn="{StaticResource sNormalLabel}" >
<Setter Property="FontSize" Value="16" />
</Style>
次に、キーを持たないスタイルで、BasedOn で参照することにより、そのうちの 1 つをデフォルトにします。
<!-- Apply Normal label automatically -->
<Style
TargetType="Label"
BasedOn="{StaticResource sNormalLabel}" />
通常のスタイルのラベルを自動的に適用することは非常に便利だと思いました。そうすれば、将来、デザイン チームが Wingdings などを使用することを決定した場合、アプリケーション全体 (実際にはすべてのアプリケーション同じ ResourceDictionary を共有します)。
UserControl の作成 sHeaderLabel スタイルで上部にラベルを追加したいので、適用します。
Style={StaticResource sHeaderLabel}
USerControl XAML で、すべてデザイナーで問題なく表示されます。
ただし、UserControl を MainWindow に追加すると、ヘッダー ラベルは sNormalLabel スタイル (自動的に適用されるスタイル) に戻ります。
スタイルが適用される順序に関係していると思います。UserControl は作成後に MainWindow によってスタイル設定され、sHeaderLabel スタイルは自動スタイルによって上書きされます。
これにより、いくつかの未回答の質問が残ります。
- 私が行ったように自動的に適用されたスタイルを使用することは珍しく、ベストプラクティスに反していますか? とても実用的だと思いましたが、これは間違った方法かもしれません。
- これらの自動スタイルが適用されないように、特定のコントロールを明示的に除外する方法はありますか? 考えられる唯一の方法は、Label を HeaderLabel で拡張し、別のリソース キーを適用して、HeaderLabel に sHeaderLabel スタイルが自動的に適用されるようにすることです。他に方法はありますか?
誰かが同様のことで実際の経験を持っている場合は、いくつかの指針をいただければ幸いです。
編集: 興味深いことに、これらの問題は Font* プロパティでしか見られないことに気付きました。前景/背景ブラシを通常/ヘッダー スタイルで異なる設定にすると、(sHeaderLabel にスタイル設定された) UserControl のラベルが正しい色のままになります。ただし、sHeaderLabel で FontWeight を太字に設定しても効果はありません。
また、HeaderTExtBox スタイルを使用して、同じ方法で TextBox スタイルを設定しましたが、ラベルのみで問題は発生しません。
乾杯!
./フレドリック