我有以下情况(简化):
在我的 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 以一种没有键的样式引用它来将其中一个设为默认值:
<!-- Apply Normal label automatically -->
<Style
TargetType="Label"
BasedOn="{StaticResource sNormalLabel}" />
我认为自动应用常规样式的标签非常方便,这样我知道如果将来我们的设计团队决定使用 Wingdings 之类的东西,整个应用程序(实际上所有应用程序)都非常容易更改共享相同的资源字典)。
创建一个用户控件我想在顶部添加一个带有 sHeaderLabel 样式的标签,所以我应用
Style={StaticResource sHeaderLabel}
在 USerControl XAML 中,在设计器中一切看起来都很好。
但是,当我将 UserControl 添加到 MainWindow 时,标题标签会回到 sNormalLabel 样式(自动应用的样式)。
我认为它与应用样式的顺序有关,UserControl 在创建后由 MainWindow 设置样式,并且 sHeaderLabel 样式被自动覆盖。
这给我留下了几个悬而未决的问题:
- 像我一样使用自动应用的样式是否不常见且违反最佳实践?我认为它非常实用,但也许这是错误的方法。
- 有没有办法明确排除某些控件应用这些自动样式?我能想到的唯一方法是使用 HeaderLabel 扩展 Label 并应用不同的资源键,以便 HeaderLabel 自动应用 sHeaderLabel 样式。还有其他方法吗?
如果有人对类似的事情有任何实际经验,我将不胜感激。
EDIT: Interestingly, I just realized that I only see these problems with the Font* properties. Setting Foreground/Background brushes differently in Normal/Header style leaves the Label in the UserControl (which is styled to sHeaderLabel) with the CORRECT color. Setting FontWeight to bold in sHeaderLabel has no effect however.
I have also set up TextBox styles in the same way, with a HeaderTExtBox style, and I don't see the problem there either, only with Labels.
Cheers!
./Fredrik