2010-04-13 8 views
0

Dans mon application, j'utilise le dictionnaire de ressources ShinyBlue.xaml qui a ce code pour le contrôle GroupBox:en utilisant le style dans WPF

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

Ces style commun pour toute application. Mais dans l'une des formes que je veux changer le Background à Transparent. Je veux remplacer seulement la propriété mais Background cela ne fonctionne pas

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

Le code ci-dessus fonctionne pas correctement.

Comment puis-je changer le GroupBoxBackground sous une forme spécifique?

Répondre

0

Votre ControlTemplate n'utilise pas réellement la propriété Background, mais il affecte une valeur concrète à la propriété Background de la bordure, à savoir {DynamicResource LightBrush}. Maintenant, lorsque vous définissez la propriété Background localement, cela n'a aucun effet car la bordure utilise toujours la ressource LightBrush.
Vous devez utiliser TemplateBinding s pour faire le bon arrière-plan apparaissent dans votre contrôle comme celui-ci:

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

De cette façon, la propriété Border utilise en fait en arrière-plan du GroupBox. Pour le faire utiliser le LightBrush par défaut, j'ai ajouté un Setter qui définit la valeur par défaut de la propriété Background. Cette valeur peut ensuite être remplacée en définissant localement la propriété Background sur votre GroupBox.

+0

merci. Super Stuff. – Polaris