由于我的应用程序中有多个Window
,我正在寻找一种不需要我在每个Window
上设置binding
的解决方案。
我创建了一个ResourceDictionary
,其中style
为窗口背景:
<Style TargetType="{x:Type Window}">
<Setter Property="Background" Value="AliceBlue"/>
</Style>
在我的XAML
中,我设置了ResourceDictionary
:
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Templates.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
没有错误,但我的Window
颜色保持白色。
这似乎是由WPF从嵌套的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
之前创建窗口。在嵌套的ResourceDictionary
被处理之前,它寻找一个默认的样式(带有x:Key="{x:Type Window}"
的样式),但是什么也找不到。因此,在运行时,窗口以默认颜色显示。(这是上面评论中描述的行为。)请记住,x:Key="{x:Type Window}"
的样式具有与Windows样式匹配的默认值。
如果显式地使用myStyle
,就可以证明这一点。如果您将属性Style="{StaticResource myStyle}"
添加到Window
定义中,您将发现设计器失败,但您也会得到一个运行时错误,因为在窗口需要myStyle
时还没有创建它。如果你切换到Style="{DynamicResource myStyle}"
,那么你会看到它像你希望的那样工作,因为DynamicResource
将在ResourceDictionary
被解析并包含样式后更新。
因此,应用此,您可以通过将此添加到窗口元素中的一种方式解决问题:Style="{DynamicResource {x:Type Window}}"
-但这是模糊的。更好的解决方案是将资源字典包含在app.xaml
文件中,在打开任何窗口之前对其进行解析,从而对所有人可用:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Templates.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
这里真正的问题是,你的Window
不是真正的Window
:它是从Window
派生的类,实际上是MainWindow
, Window2
等…这意味着Window
的自动样式连接将永远不会以这种方式工作,并且不幸的是,总是需要某种程度的手动绑定。
这是我在应用程序中使用的解决方案。它让我保持所有的窗口样式在一起,只需要在<Window.Resources>
部分之后的几行。
像这样做你的Style
:
<Style x:Key="MyWindowStyle">
<Setter Property="Window.Background" Value="AliceBlue"/>
</Style>
然后,在您的窗口中,在</Window.Resources>
之后包括以下内容:
<Window.Style>
<Style BasedOn="{StaticResource MyWindowStyle}"/>
</Window.Style>
在你的资源字典中添加一个新的笔刷
<SolidColorBrush x:Key="WindowBackground" Color="AliceBlue" />
在WPF窗口中,只需将所需的资源设置为窗口背景属性
<Window x:Class="GDD.Presentation.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="300" Width="300"
Background="{StaticResource WindowBackground}">