.net WPF默认样式和用户控件-最佳实践?
我有以下情况(简化): 在我的ResourceDictionary中,我为标签定义了两种命名样式:.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" /> <!-- ... --> <
<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样式被自动样式覆盖
这给我留下了几个未回答的问题:
/弗雷德里克嗯,我想出来了 我还有一个默认的
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}