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?.
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 TemplateBinding
s 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.