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
的类,实际上是MainWindow
, Window2
等……这意味着Window
的自动样式连接将永远不会在这里工作不幸的是,总是需要一定程度的手动绑定。
这是我在我的应用程序中使用的解决方案。 它允许我将所有窗口样式保持在一起,并且在
部分之后只需要几行。
你的Style
是这样的:
然后,在您的Window中,在包含以下内容: