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

时间:2013-07-30 13:43:57

标签: .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>

然后我通过使用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样式被自动样式覆盖。

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

  1. 使用自动应用的样式是不常见且与最佳实践相反?我认为这很实用,但也许这是错误的方法。
  2. 有没有办法明确排除某些控件应用这些自动样式?我能想到的唯一方法是使用HeaderLabel扩展Label并应用不同的资源键,以便HeaderLabel自动应用sHeaderLabel样式。还有其他办法吗?
  3. 如果有人对类似的东西有任何实际经验,我会很感激。

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

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

    干杯!

    ./弗雷德里克

2 个答案:

答案 0 :(得分:2)

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

为了回应最终成为您的问题,一个很好的例子是将样式应用于TextBlock。此样式将应用于LabelButton以及框架中任何可能包含TextBlock的任何其他控件,该控件不会覆盖您正在设置的样式。< / p>

将样式应用于类型的所有实例时,不能“取消应用”样式,只能使用新样式覆盖样式。除非您能够准确预测应用程序中的所有内容(例如样式化您制作的控件),否则应避免使用自动样式来设置x:Key

答案 1 :(得分:0)

好吧,我明白了。

我还有一个TextBlock的默认样式,删除它是全局修复全部。根据MSDN,LabelTextBlock与遗传没有任何关系,而TextBlock

} p>

可能Control在内部使用Label进行渲染,我不知道,但显然TextBlock默认样式正在影响TextBlock的行为。