Wpf 覆盖generic.xaml中定义的样式将导致合并样式
我有一个在单独的资源字典中定义了样式的控件,并使用generic.xaml魔术来应用它 如果我理解msdn()中描述的查找机制,则generic.xaml将在应用程序资源之后使用,但是为MyWindow添加样式将导致generic.xaml中的样式+App.xaml中定义的样式 这是我的密码: Generic.xamlWpf 覆盖generic.xaml中定义的样式将导致合并样式,wpf,xaml,generic.xaml,Wpf,Xaml,Generic.xaml,我有一个在单独的资源字典中定义了样式的控件,并使用generic.xaml魔术来应用它 如果我理解msdn()中描述的查找机制,则generic.xaml将在应用程序资源之后使用,但是为MyWindow添加样式将导致generic.xaml中的样式+App.xaml中定义的样式 这是我的密码: Generic.xaml <ResourceDictionary ...> <Style TargetType="{x:Type test:MyWindow}" BasedOn="
<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样式的“Default!”作为标题
为什么wpf不停止在应用程序级别搜索样式?这是因为默认(主题)样式的处理方式与普通样式不同
考虑一下:
样式
属性的特殊情况。在这里,Style
属性由任何样式资源用与该元素类型匹配的键填充此查找不会进入主题MyWindow.Style
的值时,它会遍历优先级列表并决定使用“5.implicit Style”来分配它。然后它在App.xaml中找到一个匹配的样式并使用它。如果您在运行时检查MyWindow的属性,您应该确实看到MyWindow.Style
被设置为App.xaml中的属性。因此,WPF实际上停止了在应用程序级别搜索样式
只是由于DefaultStyleKeyProperty
,默认样式仍然存在于DependencyProperty查找列表中,尽管优先级低于App.xaml样式
在这种情况下,App.xaml没有设置Title
属性,因此DependencyProperty引擎返回到Generic.xaml中的默认样式以提供值。这就是为什么你会有这种融合风格的行为
当然,请注意,只有当Generic.xaml变魔术时,才会发生这种情况