繁体   English   中英

在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添加样式将导致通用样式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为什么不停止在应用程序级别搜索样式?

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

考虑“ 依赖项属性”查找优先级列表

  1. 财产制度的强制。
  2. 活动动画。
  3. 本地价值。
  4. TemplatedParent属性。 来自TemplatedParent的触发器和属性集。
  5. 隐式风格。 Style属性的一种特殊情况。 在此, Style属性由任何样式资源填充,且其键与该元素的类型匹配。 此查询不会涉及主题
  6. 样式触发器。 在页面或应用程序的样式内触发。
  7. 模板触发器。
  8. 样式设置器。
  9. 默认(主题)样式。
  10. 遗产。
  11. 依赖项属性元数据中的默认值。

当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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM