[英]overriding styles defined in generic.xaml results in merged style
我有一个在单独的资源字典中定义的样式的控件,并使用generic.xaml魔术应用了它。
如果我了解msdn( https://msdn.microsoft.com/de-de/library/ms750613%28v=vs.110%29.aspx )上描述的查找机制,则在应用程序资源之后使用了generic.xaml,但是为MyWindow添加样式将导致通用样式xaml + App.xaml中定义的样式。
这是我的代码:
Generic.xaml
<ResourceDictionary ...>
<Style TargetType="{x:Type test:MyWindow}" BasedOn="{StaticResource ResourceKey={x:Type Window}}">
<Setter Property="Background" Value="Gainsboro" />
<Setter Property="Title" Value="Default!" />
</Style>
</ResourceDictionary>
App.xaml中
<Application.Resources>
<ResourceDictionary>
<Style TargetType="{x:Type test:MyWindow}" BasedOn="{StaticResource ResourceKey={x:Type Window}}">
<Setter Property="Background" Value="HotPink" />
</Style>
</Application.Resources>
该窗口将具有粉红色背景(来自application.resource样式)和“默认!” 作为generic.xaml样式的标题。
wpf为什么不停止在应用程序级别搜索样式?
这是因为默认(主题)样式与普通样式不同。
考虑“ 依赖项属性”查找优先级列表 :
- 财产制度的强制。
- 活动动画。
- 本地价值。
- TemplatedParent属性。 来自TemplatedParent的触发器和属性集。
- 隐式风格。
Style
属性的一种特殊情况。 在此,Style
属性由任何样式资源填充,且其键与该元素的类型匹配。 此查询不会涉及主题 。- 样式触发器。 在页面或应用程序的样式内触发。
- 模板触发器。
- 样式设置器。
- 默认(主题)样式。
- 遗产。
- 依赖项属性元数据中的默认值。
当WPF确定MyWindow.Style
的值时,它将通过优先级列表并决定使用“ 5.隐式样式”进行分配。 因此,然后在App.xaml中找到匹配的样式并使用它。 如果在运行时检查MyWindow的属性,则实际上应该看到MyWindow.Style
已设置为App.xaml中的MyWindow.Style
。 因此,WPF实际上确实停止了在应用程序级别上搜索样式。
只是由于DefaultStyleKeyProperty
,所以DependencyProperty查找列表中仍存在默认样式,尽管其优先级低于App.xaml样式。
在这种情况下,App.xaml不会设置Title
属性,因此DependencyProperty引擎将退回到Generic.xaml中的默认样式以提供一个值。 因此,这就是您获得合并样式行为的原因。
当然,请注意,只有在正确设置 Generic.xaml魔术后,才会发生这种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.