Pergunta

No meu aplicativo, eu uso o dicionário de recursos shinyblue.xaml que possui esse código para o GroupBox ao controle:

    <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>

Esse estilo comum para todos os aplicativos. Mas em uma das formas, quero mudar o Background para Transparent. Eu quero substituir apenas o Background propriedade, mas não funciona

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

O código acima não funciona corretamente.

Como posso mudar o GroupBox Background de uma forma específica?.

Foi útil?

Solução

Seu ControlTemplate não usa a propriedade em segundo plano, mas atribui um valor concreto à propriedade de fundo da fronteira, ou seja, {DynamicResource LightBrush}. Agora, quando você define a propriedade em segundo plano localmente, isso não tem efeito porque a borda ainda usa o LightBrush recurso.
Você tem que usar TemplateBindings fazer com que o fundo correto apareça em seu controle assim:

<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>

Dessa forma, a borda realmente usa a propriedade de fundo do GroupBox. Para fazê -lo usar o LightBrush Por padrão, adicionei um setter que define o valor padrão para a propriedade em segundo plano. Esse valor pode ser substituído configurando localmente a propriedade em segundo plano na sua caixa de grupo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top