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

标签 .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 样式的标签,这样我就应用了
Style={StaticResource sHeaderLabel}

在 USerControl XAML 中,在设计器中一切看起来都很好。

但是,当我将 UserControl 添加到 MainWindow 时,标题标签将返回到 sNormalLabel 样式(自动应用的样式)。

我认为这与应用样式的顺序有关,UserControl 在创建后由 MainWindow 设置样式,而 sHeaderLabel 样式被自动样式覆盖。

这给我留下了几个悬而未决的问题:
  • 像我一样使用自动应用的样式是否不常见且与最佳实践相反?我认为它非常实用,但也许这是错误的方法。
  • 有什么方法可以明确排除某些控件应用这些自动样式?我能想到的唯一方法是使用 HeaderLabel 扩展 Label 并应用不同的资源键,以便 HeaderLabel 自动应用 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/

    相关文章:

    c# - 将字符串格式化为具有负货币的货币,例如 $(10.00)

    c# - 如何部署 "SQL Server Express + EF"应用程序

    c# - ShowDialog 在 WPF 中的处理方式是否与 Winforms 不同?

    python - 如何通过比较两列来为 Pandas 表着色

    jquery - 模仿jquery ui对话框按钮样式

    .net - Matlab 无法加载 .NET 程序集

    c# - 尝试从 ExpandoObject 获取动态属性时出现 "System.StackOverflowException"错误

    c# - Mutex 对象是否通过引用传递?

    c# - 将可观察集合绑定(bind)到上下文菜单

    WPF C# 按钮样式