在下面的代码中,为什么第一个示例可能无法将背景设置为蓝色,但是,第二个示例可以正常工作,他们都可以 - 也就是说,将背景设置为蓝色?有趣的是,当在第二个例子中应用样式时,即使未在样式中指定BorderThickness,属性值“3”也会被拾取,大概是因为新样式根本没有设置它。
代码1:
<GroupBox Margin="4,12,4,4"
Grid.ColumnSpan="4"
Grid.Column="0"
Grid.Row="3"
Header="{x:Static res:UIResources.DepreciationText}"
BorderBrush="{DynamicResource MainControlBorderBrush}"
BorderThickness="3"
Background="Blue" />
代码2:
<GroupBox Margin="4,12,4,4"
Grid.ColumnSpan="4"
Grid.Column="0"
Grid.Row="3"
Header="{x:Static res:UIResources.DepreciationText}"
BorderBrush="{DynamicResource MainControlBorderBrush}"
BorderThickness="3">
<GroupBox.Style>
<Style TargetType="GroupBox">
<Setter Property="Background"
Value="Blue" />
</Style>
</GroupBox.Style>
</GroupBox>
您可以从上述观察中得出以下结论:
1)某些Style被应用到树上的GroupBox - 甚至可能是某些GroupBox的基类,例如Control,因为找不到搜索样式定位GroupBox的对象。
2)控件实例上设置的属性不会覆盖定位控件的样式中设置的相同属性。
3)除了使用BasedOn属性之外,没有办法扩充继承的Style。使用BaseOn属性意味着你必须知道你希望以它为基础的样式的键,除非你想使用带有应用于Type的Style的BasedOn,你可以以某种方式指定 - 也许使用BasedOn中的Type名称?
任何人都可以确认或纠正上述断言,以及他们是否正确解释了观察到的结果?
答案 0 :(得分:2)
您是否正在使用任何类型的主题包来重新设计控件?我的猜测是你有一个样式覆盖控件模板,这样就完全忽略了Background属性。如果控件模板不包含{TemplateBinding Background}
,则Background属性不执行任何操作。
您可以通过显式设置属性来覆盖属性,即使它们也是以样式设置的。
通过自己设置样式而不使用BasedOn,它隐式使用GroupBox的默认控件模板,而不是解析为随资源导入的样式。如果要使用导入的资源样式,可以执行以下操作:
<Style TargetType="GroupBox" BasedOn="{StaticResource {x:Type GroupBox}}">
<Setter Property="Background" Value="Blue" />
</Style>
我怀疑这会给你与第一种情况相同的结果,因为现在你将继承忽略你的背景值的有问题的控制模板。