合并字典中的WPF重写样式
本文关键字:重写 样式 WPF 字典 合并 | 更新日期: 2023-09-27 18:22:02
在我的字典文件中,我有
<Style TargetType="{x:Type Label}" BasedOn="{StaticResource {x:Type Label}}">
<Setter Property="Foreground" Value="White" />
<Setter Property="Background" Value="Black" />
</Style>
在我的Window xaml文件中,我有
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/XXX;component/XXX.xaml"/>
</ResourceDictionary.MergedDictionaries>
<Style TargetType="Label" BasedOn="{StaticResource {x:Type Label}}">
<Setter Property="FontSize" Value="20"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
</ResourceDictionary>
</Window.Resources>
在设计器中,我可以看到标签有黑色背景和白色前景,但在运行时,它有默认的黑色前景和透明背景。很明显,我想继承字典样式,但它不起作用。我在里面做错了什么?我正在使用VS 2013和.NET 4.5
编辑:如果我删除Windows.Resources中的样式,那么字典样式将被应用。如果我将样式从Windows Resource移到包含一些标签的StackPanel.Resource,那么继承就可以很好地进行
根据MSDN,合并资源词典:
If a key is defined in the primary dictionary and also in a dictionary that was merged, then the resource that is returned will come from the primary dictionary.
根据这个规则,你的第二种风格是第一个找到的。然后,该样式引用具有相同{x:Type Label}
键的样式。出于某种原因,它解析为null
。然而,检查第一个样式会发现,它的BasedOn引用已按预期解析为默认的Label样式。当两种样式都被赋予相同的显式键时,情况也是一样的。然而,当它们被赋予不同的密钥时,一切都会按预期进行。
我的猜测是,第二种风格比第一种风格更隐蔽。也许BasedOn引用被解析为样式本身,但为了防止循环依赖,它被设置为null。
就我个人而言,我会使用明确的密钥。对于那些需要应用于某个类型的所有元素,但在某些情况下仍需要重写的样式,我会将其分为两种样式:
// The actual style, with all its setters, is given a descriptive name:
<Style x:Key="DescriptiveName" TargetType="Label" BasedOn="{StaticResource {x:Type Label}}">
// Setters go here
</Style>
// A 'dummy' style that references the above style.
// Its sole purpose is to apply the style to all elements of the target type.
<Style TargetType="Label" BasedOn="{StaticResource DescriptiveName}" />
当你需要覆盖样式时,你可以通过它的名称明确地引用它:
<Style TargetType="Label" BasedOn="{StaticResource DescriptiveName}">
// Overriding setters go here
</Style>