gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:25:51 26 4
gpt4 key购买 nike

我有以下情况(简化):

在我的 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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com