Wpf 覆盖generic.xaml中定义的样式将导致合并样式

Wpf 覆盖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="

我有一个在单独的资源字典中定义了样式的控件,并使用generic.xaml魔术来应用它

如果我理解msdn()中描述的查找机制,则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>

该窗口将有一个粉红色背景(来自application.resource样式)和generic.xaml样式的“Default!”作为标题

为什么wpf不停止在应用程序级别搜索样式?

这是因为默认(主题)样式的处理方式与普通样式不同

考虑一下:

  • 产权制度强制
  • 活动动画
  • 本地值
  • TemplatedParent属性。TemplatedParent中的触发器和属性集
  • 含蓄的风格。
    样式
    属性的特殊情况。在这里,
    Style
    属性由任何样式资源用与该元素类型匹配的键填充此查找不会进入主题
  • 样式触发器。页面或应用程序中样式内的触发器
  • 模板触发器
  • 风格设定者。
  • 默认(主题)样式。
  • 继承权
  • 依赖项属性元数据的默认值
  • 当WPF决定
    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变魔术时,才会发生这种情况