1

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

如果我了解 msdn 上描述的查找机制(https://msdn.microsoft.com/de-de/library/ms750613%28v=vs.110%29.aspx),则在应用程序资源之后使用 generic.xaml,但是为 MyWindow 添加样式将导致来自 generic.xaml 的样式 + App.xaml 中定义的样式。

这是我的代码:

通用的.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>

应用程序.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 不停止在应用程序级别搜索样式?

4

1 回答 1

1

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

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

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

当 WPF 决定 的值时MyWindow.Style,它会遍历优先级列表并决定使用“5.implicit style”来分配它。然后它会在 App.xaml 中找到匹配的样式并使用它。如果您在运行时检查 MyWindow 的属性,您确实应该看到它MyWindow.Style设置为 App.xaml 中的那个。因此,WPF 实际上确实停止在应用程序级别搜索样式。

只是因为DefaultStyleKeyPropertyDependencyProperty 查找列表中的默认样式仍然存在,尽管其优先级低于 App.xaml 样式。

在这种情况下,App.xaml 不设置Title属性,因此 DependencyProperty 引擎回退到 Generic.xaml 中的默认样式以提供值。所以这就是为什么你会得到那种合并的风格行为。

当然,请注意,这只发生在正确设置Generic.xaml 魔法时。

于 2017-11-25T00:43:02.900 回答