覆盖 generic.xaml 中定义的样式会导致合并样式
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添加样式会导致样式来自generic.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>
window 将具有粉红色背景(来自 application.resource 样式)和 "Default!" 作为 generic.xaml 样式的标题。
为什么 wpf 不停止在应用程序级别搜索样式?
这是因为默认(主题)样式的处理方式与普通样式不同。
考虑 Dependency Property lookup precedence list:
- Property system coercion.
- Active animations.
- Local value.
- TemplatedParent properties. Triggers and property sets from the TemplatedParent.
- Implicit style. A special case for the
Style
property. Here, the Style
property is filled by any style resource with a key that matches the type of that element. This lookup does not proceed into the themes.
- Style triggers. Triggers within styles from page or application.
- Template triggers.
- Style setters.
- Default (theme) style.
- Inheritance.
- Default value from dependency property metadata.
当 WPF 决定 MyWindow.Style
的值时,它遍历优先级列表并决定使用“5.隐式样式”来分配它。然后它在 App.xaml 中找到匹配的样式并使用它。如果您在运行时检查 MyWindow 的属性,您确实应该看到 MyWindow.Style
设置为 App.xaml 中的那个。因此,WPF 实际上确实 停止在应用程序级别搜索样式。
只是因为 DefaultStyleKeyProperty
,默认样式仍然存在于 DependencyProperty 查找列表中,尽管优先级低于 App.xaml 样式。
在这种情况下,App.xaml 没有设置 Title
属性,因此 DependencyProperty 引擎回退到 Generic.xaml 中的默认样式以提供价值。所以这就是为什么你会得到那种合并的风格行为。
当然,请注意,这仅在 Generic.xaml 魔法 is set up properly.
时发生
我有一个控件,其样式在单独的资源字典中定义,并使用 generic.xaml 魔法来应用它。
如果我理解msdn上描述的查找机制(https://msdn.microsoft.com/de-de/library/ms750613%28v=vs.110%29.aspx),generic.xaml是在应用程序资源之后使用的,但是为MyWindow添加样式会导致样式来自generic.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>
window 将具有粉红色背景(来自 application.resource 样式)和 "Default!" 作为 generic.xaml 样式的标题。
为什么 wpf 不停止在应用程序级别搜索样式?
这是因为默认(主题)样式的处理方式与普通样式不同。
考虑 Dependency Property lookup precedence list:
- Property system coercion.
- Active animations.
- Local value.
- TemplatedParent properties. Triggers and property sets from the TemplatedParent.
- Implicit style. A special case for the
Style
property. Here, theStyle
property is filled by any style resource with a key that matches the type of that element. This lookup does not proceed into the themes.- Style triggers. Triggers within styles from page or application.
- Template triggers.
- Style setters.
- Default (theme) style.
- Inheritance.
- Default value from dependency property metadata.
当 WPF 决定 MyWindow.Style
的值时,它遍历优先级列表并决定使用“5.隐式样式”来分配它。然后它在 App.xaml 中找到匹配的样式并使用它。如果您在运行时检查 MyWindow 的属性,您确实应该看到 MyWindow.Style
设置为 App.xaml 中的那个。因此,WPF 实际上确实 停止在应用程序级别搜索样式。
只是因为 DefaultStyleKeyProperty
,默认样式仍然存在于 DependencyProperty 查找列表中,尽管优先级低于 App.xaml 样式。
在这种情况下,App.xaml 没有设置 Title
属性,因此 DependencyProperty 引擎回退到 Generic.xaml 中的默认样式以提供价值。所以这就是为什么你会得到那种合并的风格行为。
当然,请注意,这仅在 Generic.xaml 魔法 is set up properly.
时发生