我有一个控件,其中的样式在单独的资源字典中定义,并使用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不会在应用程序级别停止搜索样式?
答案 0 :(得分:0)
这是因为默认(主题)样式的处理方式与普通样式不同。
考虑Dependency Property lookup precedence list:
- 物业系统强制。
- 动态动画。
- 本地值。
- TemplatedParent属性。来自TemplatedParent的触发器和属性集。
- 隐式样式。
Style
属性的特例。这里,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 magic is set up properly。
时