generic.xaml中定义的重写样式会导致合并样式

时间:2015-07-03 11:09:47

标签: wpf xaml generic.xaml

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

如果我理解在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>

窗口将具有粉红色背景(来自application.resource样式)和&#34;默认!&#34;作为generic.xaml风格的标题。

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

1 个答案:

答案 0 :(得分:0)

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

考虑Dependency Property lookup precedence list

  
      
  1. 物业系统强制。
  2.   
  3. 动态动画。
  4.   
  5. 本地值。
  6.   
  7. TemplatedParent属性。来自TemplatedParent的触发器和属性集。
  8.   
  9. 隐式样式。 Style属性的特例。这里,Style属性由任何样式资源填充,其键与该元素的类型相匹配。 此查询不会进入主题
  10.   
  11. 样式触发器。从页面或应用程序中触发样式。
  12.   
  13. 模板触发器。
  14.   
  15. 样式制定者。
  16.   
  17. 默认(主题)风格。
  18.   
  19. 继承。
  20.   
  21. 依赖项属性元数据的默认值。
  22.   

当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 magic is set up properly