WPF默认样式和UserControls - 最佳实践?

Fre*_*rik 5 .net wpf styles

我有以下情况(简化):

在我的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样式被自动样式覆盖.

这给我留下了几个悬而未决的问题:

  1. 像我一样使用自动应用的样式是不常见并且与最佳实践相反?我认为这很实用,但也许这是错误的方法.
  2. 有没有办法明确排除某些控件应用这些自动样式?我能想到的唯一方法是使用HeaderLabel扩展Label并应用不同的资源键,以便HeaderLabel自动应用sHeaderLabel样式.还有其他方法吗?

如果有人对类似的东西有任何实际经验,我会很感激.

编辑:有趣的是,我刚刚意识到我只看到Font*属性的这些问题.在Normal/Header样式中以不同方式设置Foreground/Background画笔会使用CORRECT颜色将UserControl中的Label(使用sHeaderLabel设置样式)保留.但是,在sHeaderLabel中将FontWeight设置为粗体无效.

我也以相同的方式设置TextBox样式,使用HeaderTExtBox样式,我也没有看到问题,只有标签.

干杯!

./Fredrik

Wil*_*ins 4

一个好的做法可能是避免将基本自动样式应用于标准类型,因为结果可能是不可预测的。

为了回答最终成为您的问题,一个很好的例子是将样式应用于TextBlock. 此样式将应用于LabelButton以及框架中任何位置的任何其他控件,这些控件可能包含TextBlock不覆盖您设置的样式的 。

将样式应用于某个类型的所有实例时,您无法“取消应用”样式,只能使用新样式覆盖该样式。除非您可以准确预测应用程序中这将影响的所有内容(例如您制作的控件的样式),否则您应该避免使用自动样式,而应设置x:Key.