2012-11-29 5 views
0

Blend/WPF/Silverlight의 VisualState 도구는 훌륭하지만 모든 경우에 버그가 있음을 모두 동의 할 수 있다고 생각합니다. 여기에 예제가있다. 나는 약간의 설명/해결 방법/수정을 원한다.VisualStateManager는 '생성되지 않은'전환을 건너 뛰지 않습니다.

<VisualState x:Name="Hidden"> 
     <Storyboard> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="contentPresenter"> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="0"> 
        <EasingDoubleKeyFrame.EasingFunction> 
           <CircleEase EasingMode="EaseOut"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
      </DoubleAnimationUsingKeyFrames> 
      <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.LayoutTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="contentPresenter"> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="1"> 
        <EasingDoubleKeyFrame.EasingFunction> 
         <CircleEase EasingMode="EaseOut"/> 
        </EasingDoubleKeyFrame.EasingFunction> 
       </EasingDoubleKeyFrame> 
              <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0"> 
               <EasingDoubleKeyFrame.EasingFunction> 
                <CircleEase EasingMode="EaseOut"/> 
               </EasingDoubleKeyFrame.EasingFunction> 
              </EasingDoubleKeyFrame> 
             </DoubleAnimationUsingKeyFrames> 
             <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.LayoutTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="contentPresenter"> 
              <EasingDoubleKeyFrame KeyTime="0:0:0.3" Value="1"> 
               <EasingDoubleKeyFrame.EasingFunction> 
                <CircleEase EasingMode="EaseOut"/> 
               </EasingDoubleKeyFrame.EasingFunction> 
              </EasingDoubleKeyFrame> 
              <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0"> 
               <EasingDoubleKeyFrame.EasingFunction> 
                <CircleEase EasingMode="EaseOut"/> 
               </EasingDoubleKeyFrame.EasingFunction> 
              </EasingDoubleKeyFrame> 
             </DoubleAnimationUsingKeyFrames> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="Revealed"> 
            <Storyboard> 
             <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.LayoutTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="contentPresenter"> 
              <EasingDoubleKeyFrame KeyTime="0" Value="0"/> 
              <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="1"> 
               <EasingDoubleKeyFrame.EasingFunction> 
                <CircleEase EasingMode="EaseOut"/> 
               </EasingDoubleKeyFrame.EasingFunction> 
              </EasingDoubleKeyFrame> 
             </DoubleAnimationUsingKeyFrames> 
             <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.LayoutTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="contentPresenter"> 
              <EasingDoubleKeyFrame KeyTime="0" Value="0"/> 
              <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="1"> 
               <EasingDoubleKeyFrame.EasingFunction> 
                <CircleEase EasingMode="EaseOut"/> 
               </EasingDoubleKeyFrame.EasingFunction> 
              </EasingDoubleKeyFrame> 
             </DoubleAnimationUsingKeyFrames> 
             <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="contentPresenter"> 
              <EasingDoubleKeyFrame KeyTime="0" Value="0"/> 
              <EasingDoubleKeyFrame KeyTime="0:0:0.2" Value="0"> 
               <EasingDoubleKeyFrame.EasingFunction> 
                <CircleEase EasingMode="EaseOut"/> 
               </EasingDoubleKeyFrame.EasingFunction> 
              </EasingDoubleKeyFrame> 
              <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="1"> 
               <EasingDoubleKeyFrame.EasingFunction> 
                <CircleEase EasingMode="EaseOut"/> 
               </EasingDoubleKeyFrame.EasingFunction> 
              </EasingDoubleKeyFrame> 
             </DoubleAnimationUsingKeyFrames> 
            </Storyboard> 
           </VisualState> 

지금이 상태로 스위치를 걷어차 트리거의 시리즈를 만들 수 있지만 이 전환를 무시에 선택

은 다음과 같이 정의 시각적 상태의 무리를 생각해 보자.

전환 효과가 계속 재생됩니다. 시각적 상태 관리자는 하나 이상의 인접한 키 프레임으로 스토리 보드를보고 전환이 사용되지 않을 때 건너 뛰기보다는 채우기보다는 전체를 재생하는 것으로 보입니다.

내가 수행하려는 효과는 콘텐츠이 퇴색 한 다음 축소되는 2 단계 숨기기/노출입니다. 불행히도 이것은 전환을 무시하겠다는 나의 결정에 관계없이 '전환'상태가 항상 재생된다는 것을 의미합니다.

내가 바보 인가요? 아니면 버그입니까? 해결 방법이 있습니까?

EDIT - 전환을 "지연"시키는 급성 이징 기능을 사용하는 것이 더 좋습니까?

답변

2

VisualState 내에서 선언 된 Storyboard는 해당 상태의 VSB가 인 동안 재생되는 스토리 보드입니다..

당신이 무시하는 전환은 을 재생하는 Storyboard이며, VisualState에서 VisualState로 전환하면이됩니다. 이들은 VisualStateGroup.Transitions 섹션에서 별도로 지정됩니다.

그래서, 뭔가 같은 :

<VisualStateGroup x:Name="Something"> 
    <VisualState x:Name="Hidden"> 
    <VisualState x:Name="Revealed"> 

    <VisualStateGroup.Transitions> 
     <VisualTransition From="Hidden" To="Revealed"> 
      <Storyboard> 
       ... 
      <Storyboard> 
     </VisualTransition> 
     <VisualTransition From="Revealed" To="Hidden"> 
      <Storyboard> 
       ... 
      <Storyboard> 
     </VisualTransition> 
    </VisualStateGroup.Transitions> 
</VisualStateGroup> 

그리고 스토리 보드 내부의 적절한 애니메이션을 작성하십시오.

그런 다음 VisualStateManager의 GoToState 또는 GoToElementState 메서드의 useTransitions 매개 변수에 false를 전달하면 전환이 표시되지 않습니다.

+0

그래서 나는 어리 석다! 그걸 정리 해줘서 고마워. – Gusdor

+1

또한 의도 한 효과에 따라 시각적 상태에 "정적"스토리 보드를 포함해야 할 수도 있습니다. 즉, 애니메이션 된 속성을 특정 값으로 스냅하고 유지하는 효과가있는 애니메이션이 0 인 스토리 보드입니다. . – dtm

관련 문제