15

由于我的应用程序中有多个Windows,因此我正在寻找一种不需要我binding在每个Window.

我创建了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颜色保持白色。

4

3 回答 3

32

这似乎是由 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 样式匹配的默认值。ResourceDictionaryx: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永远不会以这种方式工作,并且在某种程度上不幸的是,总是需要手动装订。

于 2013-03-15T10:07:09.307 回答
3

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

这样做Style

<Style x:Key="MyWindowStyle">
    <Setter Property="Window.Background" Value="AliceBlue"/>
</Style>

然后,在您的窗口中,</Window.Resources>包括以下内容:

<Window.Style>
    <Style BasedOn="{StaticResource MyWindowStyle}"/>
</Window.Style>
于 2014-02-11T16:59:13.263 回答
0

在资源字典中添加新画笔

<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}">
于 2013-03-15T09:25:26.570 回答