我有以下情况(简化):
在我的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样式的Label,所以我应用
Style={StaticResource sHeaderLabel}
USerControl XAML中的,设计师看起来都很好。
但是,当我将UserControl添加到MainWindow时,标题标签会返回到sNormalLabel样式(自动应用的样式)。
我认为它与应用样式的顺序有关,UserControl在创建后由MainWindow设置样式,sHeaderLabel样式被自动样式覆盖。
这给我留下了几个悬而未决的问题:
如果有人对类似的东西有任何实际经验,我会很感激。
编辑: 有趣的是,我刚刚意识到我只看到Font *属性的这些问题。在Normal / Header样式中以不同方式设置Foreground / Background画笔会使用 CORRECT 颜色将UserControl中的Label(设置为sHeaderLabel样式)保留。 但是,在sHeaderLabel中将FontWeight设置为粗体无效。
我也以相同的方式设置TextBox样式,使用HeaderTextBox样式,我也没有看到问题,只有标签。
干杯!
./弗雷德里克
答案 0 :(得分:2)
一个好的做法可能是避免将基本自动样式应用于标准类型,因为结果可能是不可预测的。
为了回应最终成为您的问题,一个很好的例子是将样式应用于TextBlock
。此样式将应用于Label
,Button
以及框架中任何可能包含TextBlock
的任何其他控件,该控件不会覆盖您正在设置的样式。< / p>
将样式应用于类型的所有实例时,不能“取消应用”样式,只能使用新样式覆盖样式。除非您能够准确预测应用程序中的所有内容(例如样式化您制作的控件),否则应避免使用自动样式来设置x:Key
。
答案 1 :(得分:0)
好吧,我明白了。
我还有一个TextBlock
的默认样式,删除它是全局修复全部。根据MSDN,Label
和TextBlock
与遗传没有任何关系,而TextBlock
可能Control
在内部使用Label
进行渲染,我不知道,但显然TextBlock
默认样式正在影响TextBlock
的行为。