2009-09-15 3 views
5

J'ai un projet WPF avec une bordure utilisant le style suivant. Le plan consiste à faire fondre l'effet de lueur lorsque la souris passe au-dessus de la bordure et disparaître à la sortie.Comment animer l'opacité d'un DropShadowEffect?

<Style x:Key="BorderGlow" TargetType="Border"> 
    <Style.Resources> 
     <Storyboard x:Key="GlowOn"> 
      <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(DropShadowEffect.Opacity)"> 
       <SplineDoubleKeyFrame KeyTime="0:0:0.3" Value="1"/> 
      </DoubleAnimationUsingKeyFrames> 
     </Storyboard> 
     <Storyboard x:Key="GlowOff"> 
      <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(DropShadowEffect.Opacity)"> 
       <SplineDoubleKeyFrame KeyTime="0:0:0.3" Value="0"/> 
      </DoubleAnimationUsingKeyFrames> 
     </Storyboard> 
    </Style.Resources> 

    <Setter Property="CornerRadius" Value="6,1,6,1" /> 
    <Setter Property="BorderBrush" Value="{StaticResource SelectedBorder}" /> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="Background" Value="{StaticResource DeselectedBackground}" /> 
    <Setter Property="RenderTransformOrigin" Value="0.5,0.5" /> 
    <Setter Property="TextBlock.Foreground" Value="{StaticResource SelectedForeground}" /> 

    <Setter Property="RenderTransform"> 
     <Setter.Value> 
      <RotateTransform Angle="90"/> 
     </Setter.Value> 
    </Setter> 

    <Setter Property="Effect"> 
     <Setter.Value> 
      <DropShadowEffect ShadowDepth="0" BlurRadius="8" Color="#FFB0E9EF"/> 
     </Setter.Value> 
    </Setter> 

    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 

      <Trigger.EnterActions> 
       <BeginStoryboard Storyboard="{StaticResource GlowOn}"/> 
      </Trigger.EnterActions> 

      <Trigger.ExitActions> 
       <BeginStoryboard Storyboard="{StaticResource GlowOff}"/> 
      </Trigger.ExitActions> 

     </Trigger> 
    </Style.Triggers> 
</Style> 

Le problème est, rien ne se passe! L'animation fonctionne si je change le "DropShadowEffect" en "UIElement" dans le Storyboard TargetProperty, mais cela fane le contrôle entier.

Comment estomper uniquement DropShadowEffect?

Répondre

6

Quelques points à noter

1) Vous devez cibler une propriété réelle de la frontière - Vous êtes en effet d'essayer de cibler la valeur (DropShadowEffect) de la propriété effet, pas la propriété elle-même.

2) Vous devez trier la syntaxe du PropertyPath.

Changer votre propriété Storyboard.Target à ce qui suit et vous devriez être bien:

Storyboard.TargetProperty="(Effect).Opacity" 

EDIT Code de travail comme il est indiqué dans le commentaire:

<Border BorderThickness="10" Height="100" Width="100"> 
    <Border.BorderBrush> 
     <SolidColorBrush Color="Red"></SolidColorBrush> 
    </Border.BorderBrush> 
    <Border.Style> 
     <Style TargetType="Border"> 
      <Style.Resources> 
       <Storyboard x:Key="GlowOn"> 
        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" 
          Storyboard.TargetProperty="(Effect).Opacity"> 
         <SplineDoubleKeyFrame KeyTime="0:0:0.3" Value="1"/> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
       <Storyboard x:Key="GlowOff"> 
        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" 
          Storyboard.TargetProperty="(Effect).Opacity"> 
         <SplineDoubleKeyFrame KeyTime="0:0:0.3" Value="0"/> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
      </Style.Resources> 

      <Setter Property="CornerRadius" Value="6,1,6,1" /> 
     <!--<Setter Property="BorderBrush" 
        Value="{StaticResource SelectedBorder}" />--> 
      <Setter Property="BorderThickness" Value="1" /> 
     <!--<Setter Property="Background" 
        Value="{StaticResource DeselectedBackground}" />--> 
      <Setter Property="RenderTransformOrigin" Value="0.5,0.5" /> 
     <!--<Setter Property="TextBlock.Foreground" 
        Value="{StaticResource SelectedForeground}" />--> 

      <Setter Property="RenderTransform"> 
       <Setter.Value> 
        <RotateTransform Angle="90"/> 
       </Setter.Value> 
      </Setter> 

      <Setter Property="Effect"> 
       <Setter.Value> 
        <DropShadowEffect ShadowDepth="20" 
             BlurRadius="8" 
             Color="#FFB0E9EF"/> 
       </Setter.Value> 
      </Setter> 

      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 

        <Trigger.EnterActions> 
         <BeginStoryboard 
           Storyboard="{StaticResource GlowOn}"/> 
        </Trigger.EnterActions> 

        <Trigger.ExitActions> 
         <BeginStoryboard 
           Storyboard="{StaticResource GlowOff}"/> 
        </Trigger.ExitActions> 

       </Trigger> 
      </Style.Triggers> 

     </Style> 
    </Border.Style> 
</Border> 
+0

je reçois un InvalidOperationException parce que l'effet n » t avoir une propriété Opacité. La valeur de Effect est DropShadowEffect qui a la propriété Opacity que j'essaie de cibler, mais comme vous le signalez, mon XAML est faux. J'ai essayé de définir x: Name sur DropShadowEffect mais vous ne pouvez pas utiliser TargetName dans Styles. Il y a un trou dans la documentation de MSDN sur l'utilisation de ces crochets dans les storyboards, mais je l'ai retrouvé dans l'aide de PropertyPath. Cependant, je ne peux toujours pas résoudre le problème. Je pense que j'ai besoin de lancer Effect to DropShadowEffect mais cela ne semble pas possible dans XAML. D'autres idées? – Zodman

+0

J'ai réussi à obtenir le code que vous avez posté en utilisant la syntaxe que j'ai fournie, je l'ai fait dans un exemple d'application dépouillé. Je vais poster ce que j'ai utilisé et vous pouvez peut-être travailler à partir de ça ... –

+0

Remarque J'ai supprimé les setters qui utilisent des ressources statiques que vous n'avez pas fournies mais qui ne vont pas effectuer la démonstration. Et je remarque que vous essayez de définir la propriété TextBlock.Foreground dans votre style qui ne fonctionnera pas non plus. –

Questions connexes