0

在我的应用程序中,我使用了 ShinyBlue.xaml 资源字典,其中包含用于GroupBox控件的代码:

    <Style TargetType="{x:Type GroupBox}">

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupBox}">
                <Grid SnapsToDevicePixels="true">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="6" />
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="6" />
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="*" />
                        <RowDefinition Height="6" />
                    </Grid.RowDefinitions>
                    <Border Grid.ColumnSpan="4" Grid.RowSpan="4"
                            Background="{DynamicResource LightBrush}"
                            CornerRadius="4,4,4,4"
                            BorderThickness="1,1,1,1" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

   </Style>

这些风格适用于所有应用程序。但是在我想将其中一种形式更改BackgroundTransparent. 我只想覆盖该Background属性,但它不起作用

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

上面的代码不能正常工作。

如何GroupBox Background以特定形式更改?

4

1 回答 1

0

您的 ControlTemplate 实际上并不使用 Background 属性,但它为 Border 的 Background 属性分配了一个具体值,即{DynamicResource LightBrush}. 现在,当您在本地设置 Background 属性时,这不起作用,因为 Border 仍然使用该LightBrush资源。
您必须使用TemplateBindings 使正确的背景出现在您的控件中,如下所示:

<Style TargetType="{x:Type GroupBox}">
    <!-- set default value for the template -->
    <Setter Property="Background" Value="{DynamicResource LightBrush}" />

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupBox}">
                <Grid SnapsToDevicePixels="true">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="6" />
                        <ColumnDefinition Width="Auto" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="6" />
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="*" />
                        <RowDefinition Height="6" />
                    </Grid.RowDefinitions>
                    <!-- Note the new TemplateBinding for the Background property! -->
                    <Border Grid.ColumnSpan="4" Grid.RowSpan="4" Background="{TemplateBinding Background}" CornerRadius="4,4,4,4" BorderThickness="1,1,1,1" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

</Style>

这样,Border 实际上使用了 GroupBox 的 Background 属性。为了让它LightBrush默认使用,我添加了一个 Setter,它定义了 Background 属性的默认值。然后可以通过在 GroupBox 上本地设置 Background 属性来覆盖此值。

于 2010-04-13T08:41:05.273 回答