2009-09-15 4 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 만 페이드 인합니까? 당신은 효과 속성의 값 (DropShadowEffect)이 아닌 재산 자체를 목표로 노력하고 적용됩니다 -

답변

6

점 몇 당신은 국경의 실제 속성을 대상으로 할 필요)

1주의합니다.

2) PropertyPath의 구문을 정렬해야합니다.

는 다음에 Storyboard.Target 속성을 변경

당신은 괜찮을 것 :

Storyboard.TargetProperty="(Effect).Opacity" 

편집 코드 작업 코멘트에서 언급 한 바와 같이 : 효과는 '아무튼 때문에 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

불투명도 속성이 있습니다. Effect의 값은 대상으로하는 불투명도 속성이있는 DropShadowEffect이지만 내 XAML이 잘못되었음을 지적합니다. DropShadowEffect에서 x : Name을 설정했지만 스타일에서 TargetName을 사용할 수 없습니다. Storyboards에서이 괄호를 사용하는 것에 대한 MSDN 문서의 구멍이 있지만 PropertyPath에 대한 도움말에서이를 추적했습니다. 그러나 나는 아직도 문제를 해결할 수 없다. DropShadowEffect에 효과를 캐스팅해야한다고 생각하지만 XAML에서는 가능하지 않습니다. 다른 아이디어가 있습니까? – Zodman

+0

필자가 제공 한 구문을 사용하여 게시 한 코드를 얻을 수있었습니다. 필자는이 코드를 제거한 샘플 응용 프로그램에서 사용했습니다. 내가 사용했던 것을 올리면 그걸로 다시 돌아올 수 있습니다. –

+0

참고 제공하지 않았지만 데모에 영향을주지 않는 정적 리소스를 사용하는 설정자는 제거했습니다. 그리고 TextBlock.Foreground 속성을 스타일 내에서 설정하려고합니다. –

관련 문제