这似乎是由 WPF 从 nested 加载/处理样式的顺序ResourceDictionary
和类的细节共同引起的Window
。
假设MainWindow
根据您的帖子定义。现在将以下内容放入Templates.xaml
:
<Style TargetType="{x:Type Window}">
<Setter Property="Background" Value="Red"/>
</Style>
<Style TargetType="{x:Type Window}" x:Key="myStyle">
<Setter Property="Background" Value="Green"/>
</Style>
如果MainWindow
没有定义样式,那么您将在设计器中看到它以红色背景显示。设计者正在解析整个 Xaml 并加载资源字典,然后绘制结果。在绘制窗口之前读取样式,因此应用红色背景。
运行应用程序时,会在应用之前创建窗口ResourceDictionary
。它在处理嵌套之前查找默认样式(带有 的样式x:Key="{x:Type Window}"
) ,但什么也没找到。因此,在运行时,窗口以默认颜色显示。(这是上面评论中描述的行为。)请记住,样式具有与 Windows 样式匹配的默认值。ResourceDictionary
x:Key="{x:Type Window}"
myStyle
如果您明确使用,则可以证明这一点。如果您将Window
属性添加到您的定义中,Style="{StaticResource myStyle}"
您会发现设计器失败,但您还会收到运行时错误,因为myStyle
在 Window 需要它时尚未创建。如果您切换到Style="{DynamicResource myStyle}"
then 您会看到它按您希望的方式工作,因为DynamicResource
一旦ResourceDictionary
解析并包含样式就会更新。
因此,应用它,您可以通过将其添加到您的 Window 元素以一种方式解决问题:Style="{DynamicResource {x:Type Window}}"
- 但这是笨拙的。更好的解决方案是将您的资源字典包含在app.xaml
文件中,在打开任何窗口之前将对其进行解析,从而对所有人可用:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Templates.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
这里真正的问题是你Window
不是真正的 a Window
:它是一个派生自Window
并且实际上将是MainWindow
,Window2
等的类......这意味着 a 的自动样式连接Window
永远不会以这种方式工作,并且在某种程度上不幸的是,总是需要手动装订。