ResourceDictionary的Windows样式不适用

Wal*_*oni 14 c# wpf xaml styles

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

我创建了一个ResourceDictionary具有style窗口背景的:

<Style TargetType="{x:Type Window}">
    <Setter Property="Background" Value="AliceBlue"/>
</Style>
Run Code Online (Sandbox Code Playgroud)

在我XAML,我设置ResourceDictionary:

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Templates.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*zey 31

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

假设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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

<Application.Resources>
    <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Templates.xaml" />
            </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

这里真正的问题是,你Window是不是一个真正的Window:它是从派生的类Window,将在事实上是MainWindow,Window2等...这意味着自动样式wireup一个Window永远不会以这种方式工作,和一定程度的不幸的是,总是需要手动绑定.


Tai*_*ary 0

在资源字典中添加新画笔

<SolidColorBrush x:Key="WindowBackground" Color="AliceBlue" />
Run Code Online (Sandbox Code Playgroud)

在 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}">
Run Code Online (Sandbox Code Playgroud)

  • 如果提出问题的人发现答案合适并接受它,我不认为它应该被否决,即使 StaticResource 是隐式设置的!只有当答案完全不相关或错误时,才应该投反对票,而不是因为有人没有使用最佳实践。 (6认同)
  • 感谢您的回答,但是如果我有多个窗口,我需要为每个窗口设置背景,这就是为什么我想直接使用样式! (4认同)