2012-11-29 47 views
0

Blend/WPF/Silverlight中的VisualState工具非常棒,但我認爲我們都可以同意這些都是trés的bug。這裏是一個例子,我想澄清一下/解決方法/修復。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階段隱藏/顯示,其中內容淡出然後收縮。不幸的是,這意味着無論我決定忽略轉折,國家的「轉型」總是會發揮作用。

我是愚蠢的還是這是一個錯誤?有沒有解決方法?

編輯 - 在這種情況下使用急性緩動功能來「延遲」一個轉換是否更好?

回答

2

在VisualState內部聲明的故事板是故事板,該故事板在VSM爲的狀態下播放,該狀態爲

您正在討論的轉換忽略了故事板,它在播放時將從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

此外,根據預期的效果,您可能還需要在視覺狀態中包含一個「靜態」故事板(即,帶有零時長動畫的故事板,這些動畫具有將動畫屬性捕捉並保持爲值的效果) 。 – dtm