来自资源词典的 Windows 样式不适用



由于我的应用程序中有多个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}">

相关内容

  • 没有找到相关文章

最新更新