Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net WPF默认样式和用户控件-最佳实践?_.net_Wpf_Styles - Fatal编程技术网

.net WPF默认样式和用户控件-最佳实践?

.net WPF默认样式和用户控件-最佳实践?,.net,wpf,styles,.net,Wpf,Styles,我有以下情况(简化): 在我的ResourceDictionary中,我为标签定义了两种命名样式: <Style x:Key="sNormalLabel" TargetType="Label" > <Setter Property="FontFamily" Value="Verdana" /> <Setter Property="FontSize" Value="12" /> <!-- ... --> <

我有以下情况(简化):

在我的ResourceDictionary中,我为标签定义了两种命名样式:

<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>
在USerControl XAML中,所有这些在设计器中看起来都很好

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

我假设这与应用样式的顺序有关,用户控件在创建后由主窗口设置样式,sHeaderLabel样式被自动样式覆盖

这给我留下了几个未回答的问题:

  • 像我这样使用自动应用的样式是否不常见,是否与最佳实践相反?我认为这很实用,但也许这是错误的做法
  • 是否有任何方法可以明确排除应用这些自动样式的某些控件?我能想到的唯一方法是使用HeaderLabel扩展Label并应用不同的资源键,以便HeaderLabel自动应用sHeaderLabel样式。还有别的办法吗
  • 如果有人有类似的实践经验,我会很感激一些建议

    编辑: 有趣的是,我刚刚意识到我只看到字体*属性的这些问题。在普通/标题样式中以不同方式设置前景/背景笔刷会使UserControl中的标签(样式设置为sHeaderLabel)使用正确的颜色。 但是,在sHeaderLabel中将FontWeight设置为粗体不会产生任何效果

    我还以同样的方式设置了文本框样式,使用了HeaderTExtBox样式,我也不认为存在问题,只是使用了标签

    干杯


    /弗雷德里克

    嗯,我想出来了

    我还有一个默认的
    TextBlock
    ,删除它是一个全局修复。根据MSDN,
    Label
    TextBlock
    没有继承关系,
    TextBlock
    不是从
    Control
    派生的,这很有趣


    可能
    Label
    在内部使用
    TextBlock
    进行渲染,我不知道这一点,但显然
    TextBlock
    默认样式影响了
    Label

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

    针对您的问题,一个很好的例子是将样式应用于
    TextBlock
    。此样式将应用于框架中任何位置的
    标签
    按钮
    ,以及可能包含未覆盖正在设置的样式的
    文本块
    的任何其他控件


    将样式应用于类型的所有实例时,不能“取消应用”样式,只能使用新样式替代样式。除非您能够准确地预测应用程序中这将影响的所有内容(例如设置所做控件的样式),否则您应该避免使用自动样式而选择设置
    x:Key

    如果您将控件排除在应用样式之外,您可能不应该首先将样式应用于所有内容。虽然我不确定是否能回答这个问题,但我倾向于避免使用自动样式,因为它们有时会意外地与包含这些类型的内置
    DataTemplates
    相混淆。例如,如果您不知道按钮是否包含
    标签
    文本块
    ,则无法确定自动样式将如何影响它。您好,谢谢您的回复!其想法是让通用控件自动符合预定义的标准。我已经多次设置表单的外观
    DataGridView
    waaa,以至于我不喜欢定义一次标准的想法,并让它应用于所有地方。那么所有的情况都是不同的,如果我必须进入并覆盖一个样式,或者在某些情况下甚至排除一个特定的控件,我非常乐意这样做。但你所说的意外副作用是完全有道理的!我已经看到Microsoft Ribbon控件做了它以前没有做过的事情。是的,
    标签确实包含
    文本块。通过阅读了解差异是很好的,其中列出的Josh Smith文章对于理解差异非常有帮助。我也给出了答案,基本上是你的问题与我的原始评论相结合的结果。嗨,Will,我关于样式应用顺序的假设是错误的,因此,需要“取消应用”一种风格是错误的。我只能同意你的看法,特别是因为我可以重写我显式使用的任何控件的样式,但不能重写这些控件的子控件。让我们希望MS为我们提供一个基于xpath的规则系统,使我们能够完全控制应用程序的样式。干杯
    
    <!-- Apply Normal label automatically -->
    <Style 
        TargetType="Label"
        BasedOn="{StaticResource sNormalLabel}" />
    
    Style={StaticResource sHeaderLabel}