关于WPF样式的澄清

时间:2013-06-17 22:01:15

标签: wpf

在下面的代码中,为什么第一个示例可能无法将背景设置为蓝色,但是,第二个示例可以正常工作,他们都可以 - 也就是说,将背景设置为蓝色?有趣的是,当在第二个例子中应用样式时,即使未在样式中指定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名称?

任何人都可以确认或纠正上述断言,以及他们是否正确解释了观察到的结果?

1 个答案:

答案 0 :(得分:2)

您是否正在使用任何类型的主题包来重新设计控件?我的猜测是你有一个样式覆盖控件模板,这样就完全忽略了Background属性。如果控件模板不包含{TemplateBinding Background},则Background属性不执行任何操作。

您可以通过显式设置属性来覆盖属性,即使它们也是以样式设置的。

通过自己设置样式而不使用BasedOn,它隐式使用GroupBox的默认控件模板,而不是解析为随资源导入的样式。如果要使用导入的资源样式,可以执行以下操作:

<Style TargetType="GroupBox" BasedOn="{StaticResource {x:Type GroupBox}}">
                    <Setter Property="Background" Value="Blue" />
</Style>

我怀疑这会给你与第一种情况相同的结果,因为现在你将继承忽略你的背景值的有问题的控制模板。