1

在下面的代码中,为什么第一个示例未能将背景设置为蓝色,但是,第二个示例的工作方式可能正如人们所期望的那样——也就是说,将背景设置为蓝色?有趣的是,在第二个示例中应用样式时,即使 Style 中没有指定 BorderThickness,但属性值“3”也被拾取,可能是因为新的 Style 根本没有设置它。

代码 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 的 Style 搜索。

2) 在控件实例上设置的属性不会覆盖以控件为目标的样式中设置的相同属性。

3) 除了使用 BasedOn 属性之外,没有办法增加继承的 Style。使用 BaseOn 属性意味着您必须知道要作为其基础的样式的键,除非如果您想将 BasedOn 与应用于类型的样式一起使用,您可以以某种方式指定 - 可能使用 BasedOn 中的类型名称?

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

4

1 回答 1

2

您是否为您的应用程序使用任何类型的主题包来重新设置控件的样式?我的猜测是,您在某处有一种样式覆盖了控件模板,从而完全忽略了 Background 属性。如果控件模板不包含 a {TemplateBinding Background},则 Background 属性不执行任何操作。

您绝对可以通过显式设置属性来覆盖属性,即使它们也在样式中设置。

通过自己设置样式而不使用 BasedOn,它隐式使用 GroupBox 的默认控件模板,而不是解析为使用资源导入的样式。如果你想使用导入的资源样式,你可以这样做:

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

我怀疑这会给您与第一种情况相同的结果,因为现在您将继承忽略您的背景值的违规控件模板。

于 2013-06-17T22:21:14.533 回答