ResourceDictionary的Windows样式不适用

由于我的应用程序中有多个Window ,我正在寻找一种不需要在每个Window上设置binding的解决方案。

我创建了一个ResourceDictionary ,它具有Window Background的style

    

在我的XAML ,我设置了ResourceDictionary

        

没有错误,但我的Window颜色保持白色。

在资源字典中添加新画笔

  

在WPF窗口中,只需将所需资源设置为窗口背景属性即可

  

这似乎是由WPF从嵌套的ResourceDictionary加载/处理样式的顺序和Window类的细节的组合引起的。

假设MainWindow是根据您的post定义的。 现在将以下内容放在Templates.xaml

   

如果MainWindow没有定义样式,那么您将在设计器中看到它以红色背景显示。 设计人员正在解析整个Xaml并加载资源字典,然后绘制结果。 在绘制窗口之前读取样式,因此应用红色背景。

运行应用程序时,将在应用ResourceDictionary之前创建窗口。 它处理嵌套的ResourceDictionary 之前查找默认样式(具有x:Key="{x:Type Window}"的样式),并且什么也没找到。 因此,在运行时,窗口将显示默认颜色。 (这是上面注释中描述的行为。)请记住, x:Key="{x:Type Window}"的样式具有与Windows样式匹配的默认值。

如果您明确使用myStyle这将得到证实。 如果你向Window定义添加属性Style="{StaticResource myStyle}"你会发现设计器失败了,但是你也遇到了运行时错误,因为在Window需要的时候还没有创建myStyle它。 如果您切换到Style="{DynamicResource myStyle}"那么您将看到它按DynamicResource工作,因为一旦解析了ResourceDictionary并包含样式, DynamicResource将更新。

因此,应用此方法,您可以通过将此问题添加到Window元素来以一种方式解决问题: Style="{DynamicResource {x:Type Window}}" – 但这很复杂。 更好的解决方案是将您的资源字典包含在app.xaml文件中,在打开任何窗口之前将其解析,从而可供所有人使用:

        

这里真正的问题是你的Window不是真正的Window :它是一个派生自Window的类,实际上是MainWindowWindow2等……这意味着Window的自动样式连接将永远不会在这里工作不幸的是,总是需要一定程度的手动绑定。

这是我在我的应用程序中使用的解决方案。 它允许我将所有窗口样式保持在一起,并且在部分之后只需要几行。

你的Style是这样的:

  

然后,在您的Window中,在包含以下内容: