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从嵌套加载/处理样式的顺序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>
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将永远不会以这种方式工作,和一定程度的不幸的是,总是需要手动绑定.
在资源字典中添加新画笔
<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)