我有以下情况(简化):
在我的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>
Run Code Online (Sandbox Code Playgroud)
然后我通过使用BasedOn引用它,使其中一个默认为没有键的样式:
<!-- Apply Normal label automatically -->
<Style
TargetType="Label"
BasedOn="{StaticResource sNormalLabel}" />
Run Code Online (Sandbox Code Playgroud)
我认为自动应用标准样式标签非常方便,我知道如果将来我们的设计团队决定使用Wingdings或其他东西,那么整个应用程序很容易改变(事实上所有应用程序都是如此)共享相同的ResourceDictionary).
创建UserControl我想在顶部添加一个带有sHeaderLabel样式的Label,因此我申请
Style={StaticResource sHeaderLabel}
Run Code Online (Sandbox Code Playgroud)
在USerControl XAML中,设计师看起来都很好.
但是,当我将UserControl添加到MainWindow时,标题标签返回到sNormalLabel样式(自动应用的样式).
我假设它与应用样式的顺序有关,UserControl在创建后由MainWindow设置样式,sHeaderLabel样式被自动样式覆盖.
这给我留下了几个悬而未决的问题:
如果有人对类似的东西有任何实际经验,我会很感激.
编辑:有趣的是,我刚刚意识到我只看到Font*属性的这些问题.在Normal/Header样式中以不同方式设置Foreground/Background画笔会使用CORRECT颜色将UserControl中的Label(使用sHeaderLabel设置样式)保留.但是,在sHeaderLabel中将FontWeight设置为粗体无效.
我也以相同的方式设置TextBox样式,使用HeaderTExtBox样式,我也没有看到问题,只有标签.
干杯!
./Fredrik
一个好的做法可能是避免将基本自动样式应用于标准类型,因为结果可能是不可预测的。
为了回答最终成为您的问题,一个很好的例子是将样式应用于TextBlock. 此样式将应用于Label、Button以及框架中任何位置的任何其他控件,这些控件可能包含TextBlock不覆盖您设置的样式的 。
将样式应用于某个类型的所有实例时,您无法“取消应用”样式,只能使用新样式覆盖该样式。除非您可以准确预测应用程序中这将影响的所有内容(例如您制作的控件的样式),否则您应该避免使用自动样式,而应设置x:Key.