2010-09-28 33 views
3

Si j'ai un ensemble de contrôles dans un StackPanel, existe-t-il un moyen générique de changer l'arrière-plan de la pile quand un contrôle dans StackPanel devient actif? (et de toute évidence, changer l'arrière-plan quand aucun contrôle dans le StackPanel a le focus). Le code suivant fonctionne pour moi, mais ce serait bien d'avoir une manière générique d'accomplir cette tâche plutôt que d'avoir à lister chaque contrôle dans chaque StackPanel de ma page.Modifier la couleur d'arrière-plan de WPF StackPanel lorsqu'un élément du panneau a le focus

Merci!

<StackPanel Margin="5"> 
    <StackPanel.Style> 
    <Style TargetType="{x:Type StackPanel}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding IsFocused, ElementName=chkOccupiedByMortgagor}" Value="true"> 
       <Setter Property="Background" Value="Gray" /> 
       <Setter Property="Opacity" Value=".5" /> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding IsFocused, ElementName=chkOccupiedByNewOwner}" Value="true"> 
       <Setter Property="Background" Value="Gray" /> 
       <Setter Property="Opacity" Value=".5" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</StackPanel.Style> 
<CheckBox Margin="2" x:Name="chkOccupiedByMortgagor">Mortgagor</CheckBox> 
<CheckBox Margin="2" x:Name="chkOccupiedByNewOwner">New Owner</CheckBox> 
<CheckBox Margin="2" x:Name="chkOccupiedByTenant">Tenant</CheckBox> 
<CheckBox Margin="2" x:Name="chkOccupiedByUnknownOccupant">Unknown Occupant</CheckBox> 
</StackPanel> 

Répondre

7

Oui. Vous pouvez le faire. Il suffit d'utiliser la propriété IsKeyboardFocusWithin pour la détente, comme ceci:

<StackPanel Margin="5"> 
    <StackPanel.Style> 
     <Style TargetType="{x:Type StackPanel}"> 
      <Style.Triggers> 
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsKeyboardFocusWithin}" Value="True"> 
        <Setter Property="Background" Value="Gray" /> 
        <Setter Property="Opacity" Value=".5" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </StackPanel.Style> 
    <CheckBox Margin="2">Mortgagor</CheckBox> 
    <CheckBox Margin="2">New Owner</CheckBox> 
    <CheckBox Margin="2">Tenant</CheckBox> 
    <CheckBox Margin="2">Unknown Occupant</CheckBox> 
</StackPanel> 

Rappelez-vous cependant, que vous devez dire le déclencheur pour rechercher la propriété dans le même élément, par conséquent, RelativeSource={RelativeSource Self}. Vous pouvez également nommer le panneau de pile et utiliser également ce code:

<StackPanel Margin="5" x:Name="stackPanel"> 
    ... 
       <DataTrigger Binding="{Binding ElementName=stackPanel, Path=IsKeyboardFocusWithin}" Value="True"> 
    ... 
+0

Cool! Exactement ce que je cherchais! Merci beaucoup! –