2009-09-15 22 views
5

私は次のスタイルを使用してボーダーを持つWPFプロジェクトを持っています。マウスが境界を越えて移動するときには、グロー効果をフェードインし、離れるときはフェードアウトさせるという計画です。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> 

問題は何も起こりません! Storyboard TargetPropertyで "DropShadowEffect"を "UIElement"に変更すると、アニメーションが機能しますが、これはコントロール全体をフェードします。

DropShadowEffectだけをフェードアウトするにはどうすればよいですか?

答えて

6

1を注意すべきポイントのカップル)あなたはボーダーの実際のプロパティをターゲットにする必要があります - あなたは、エフェクトプロパティではなく、プロパティそのものの値(DropShadowEffect)をターゲットにしようとして有効です。

2)PropertyPathの構文をソートする必要があります。

は以下にごStoryboard.Targetプロパティを変更し

、あなたは問題ないはずです。

Storyboard.TargetProperty="(Effect).Opacity" 

EDITコードを作業するコメントで述べたように:効果は「doesnのため、私は、InvalidOperationExceptionがを得る

<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

Opacityプロパティを持っています。 Effectの値は、私が目標にしようとしている不透明度プロパティを持つDropShadowEffectですが、私のXAMLが間違っていると指摘しています。 DropShadowEffectでx:Nameを設定しようとしましたが、スタイルでTargetNameを使用できません。 MSDNのドキュメントには、ストーリーボードでのこれらの括弧の使用についての穴がありますが、PropertyPathのヘルプでそれを追跡しました。しかし、私はまだ問題を解決することはできません。 DropShadowEffectにエフェクトをキャストする必要があると思いますが、これはXAMLでは可能ではないようです。 他のアイデアはありますか? – Zodman

+0

私が提供した構文を使って、あなたが投稿したコードを手に入れました。私が使用したものを投稿し、それから戻ってくるかもしれません。 –

+0

注:提供していないが、デモンストレーションには影響しない静的リソースを使用するセッターを削除しました。あなたのスタイル内でも動作しないTextBlock.Foregroundプロパティを設定しようとしていることがわかりました。 –

関連する問題