我有以下情况(简化):
在我的 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 之类的,对于整个应用程序(实际上所有应用程序)进行更改非常容易共享相同的 ResourceDictionary)。
创建一个 UserControl 我想在顶部添加一个带有 sHeaderLabel 样式的标签,这样我就应用了
Style={StaticResource sHeaderLabel}
在 USerControl XAML 中,在设计器中一切看起来都很好。
但是,当我将 UserControl 添加到 MainWindow 时,标题标签将返回到 sNormalLabel 样式(自动应用的样式)。
我认为这与应用样式的顺序有关,UserControl 在创建后由 MainWindow 设置样式,而 sHeaderLabel 样式被自动样式覆盖。
这给我留下了几个悬而未决的问题:
如果有人对类似的事情有任何实际经验,我将不胜感激。
编辑:
有趣的是,我刚刚意识到我只看到 Font* 属性的这些问题。在 Normal/Header 样式中以不同方式设置前景/背景画笔会使 UserControl 中的 Label(样式为 sHeaderLabel)带有 正确 颜色。
但是,在 sHeaderLabel 中将 FontWeight 设置为粗体无效。
我也以相同的方式设置了 TextBox 样式,使用 HeaderTExtBox 样式,我也没有看到问题,只有 Labels。
干杯!
./弗雷德里克
最佳答案
一个好的做法可能是避免将基本自动样式应用于标准类型,因为结果可能是不可预测的。
针对最终成为您的问题的原因,一个很好的例子是将样式应用于 TextBlock
.此样式将应用于 Label
, Button
,以及框架中任何可能包含 TextBlock
的任何其他控件这不会覆盖您设置的样式。
将样式应用于类型的所有实例时,您不能“取消应用”样式,只能使用新样式覆盖该样式。除非您可以准确地预测应用程序中这将影响的所有内容(例如为您制作的控件设置样式),否则您应该避免使用自动样式以支持设置 x:Key
.
关于.net - WPF 默认样式和 UserControls - 最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17948789/