2010-01-10 4 views
2

Dans un style, comment puis-je faire référence à l'élément sur lequel le style est appliqué? Par exemple, dans le style que je définis un RenderTransform, et je voudrais ajouter une animation sur le RenderTransform:Dans un style, comment puis-je faire référence à l'élément sur lequel le style est appliqué?

<Style x:Key="myStyle" TargetType="{x:Type FrameworkElement}"> 

     <Setter Property="RenderTransform"> 
      <Setter.Value> 
       <ScaleTransform /> 
      </Setter.Value> 
     </Setter> 

     <Setter Property="RenderTransformOrigin" 
       Value="0.5, 0.5" /> 

     <Style.Triggers> 
      <EventTrigger RoutedEvent="MouseDown"> 
       <BeginStoryboard> 
        <Storyboard> 
         <DoubleAnimation Duration="0:0:0.2" 
             From="1" 
             To="1.2" 
             AutoReverse="True" 
             Storyboard.Target="{Binding RenderTransform}" 
             Storyboard.TargetProperty="(ScaleTransform.ScaleX)" /> 
         <DoubleAnimation Duration="0:0:0.2" 
             From="1" 
             To="1.2" 
             AutoReverse="True" 
             Storyboard.Target="{Binding RenderTransform}" 
             Storyboard.TargetProperty="(ScaleTransform.ScaleY)" /> 
        </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 
     </Style.Triggers> 

    </Style> 

Bien sûr, le code ne fonctionne pas, parce que {Binding RenderTransform} utilise DataContext comme source. J'ai essayé de spécifier le RelativeSource avec le mode FindAncestor, mais il ne peut pas trouver un parent FrameworkElement (probablement parce que le storyboard ne fait pas partie de l'arborescence visuelle).

Existe-t-il un moyen de lier à une propriété de l'élément sur lequel le style est appliqué?

Répondre

4

Un Storyboard dans un style cible automatiquement l'élément auquel le style est appliqué. Vous pouvez donc simplement omettre le Storyboard.Target. Cependant, vous devrez modifier votre propriété TargetProperty pour naviguer à partir de l'élément lui-même plutôt qu'à partir de la propriété RenderTransform. Ce qui suit fonctionne donc pour moi:

<DoubleAnimation Duration="0:0:0.2" 
       From="1" 
       To="1.2" 
       AutoReverse="True" 
       Storyboard.TargetProperty="RenderTransform.ScaleX" /> 
+0

Bien sûr! Si simple que je n'y ai même pas pensé ... Merci! –

Questions connexes