2012-10-05 7 views
5

のための遷移を生成することができません。VisualStateManagerは、私は次のVisual国が定義されているThicknessAnimations

<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup Name="EditStates"> 

     <VisualStateGroup.Transitions> 
      <VisualTransition GeneratedDuration="0:0:2"/> 
     </VisualStateGroup.Transitions> 

     <VisualState Name="Editing" />       
     <VisualState Name="Normal"> 
      <Storyboard> 
       <ThicknessAnimation Storyboard.TargetName="ViewBorder" Storyboard.TargetProperty="Margin" To="0" Duration="0"/> 
       <DoubleAnimation Storyboard.TargetName="Header"  Storyboard.TargetProperty="(FrameworkElement.LayoutTransform).(ScaleTransform.ScaleY)" To="0" Duration="0"/> 
       <ColorAnimation  Storyboard.TargetName="EditBorder" Storyboard.TargetProperty="Background.Color" To="Red" Duration="0"/> 
      </Storyboard> 
     </VisualState>           

    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

DoubleAnimationColorAnimation細かい作業を、彼らのために2秒以上VisualStateManager生成遷移アニメーションで。

ただし、ThicknessAnimationはアニメーション化されません。代わりに、遷移期間の終わりに終了値にスナップします。

VisualStateManagerにトランジションを生成させる方法はありますか、手動でトランジションを強制する必要がありますか?

+0

私は同じことに気付きました。視覚的にBlendを使用してエッジをドラッグすると、RenderTransformを使用して内部的に動作します。手でマージンを変更するのと同じ効果があります。私はそれがバグか、実装されていない機能だと思っています。 – Wouter

答えて

2

私は、問題を分析し、.NET Reflectorを解雇し、VisualStateManagerのみ、次のアニメーションをサポートしていることが見つかりました:

  • ColorAnimation
  • DoubleAnimation
  • PointAnimation

それはどこにも記載されていないので、それは馬鹿げたものです。

アニメーションを生成できないことを証明するには、VisualStageManager.GenerateToAnimationメソッドの逆のコードを見てください。同じサブセットのアニメーションをサポートするVisualStageManager.GenerateFromAnimationもあります。

private static Timeline GenerateToAnimation(FrameworkElement root, Timeline timeline, IEasingFunction easingFunction, bool isEntering) 
{ 
    Timeline destination = null; 

    if (destination == null) 
    { 
    var targetColor = GetTargetColor(timeline, isEntering); 
    if (targetColor.HasValue) 
     destination = new ColorAnimation { To = targetColor, EasingFunction = easingFunction }; 
    } 

    if (destination == null) 
    { 
    var targetDouble = GetTargetDouble(timeline, isEntering); 
    if (targetDouble.HasValue) 
     destination = new DoubleAnimation { To = targetDouble, EasingFunction = easingFunction }; 

    } 

    if (destination == null) 
    { 
    var targetPoint = GetTargetPoint(timeline, isEntering); 
    if (targetPoint.HasValue) 
     destination = new PointAnimation { To = targetPoint, EasingFunction = easingFunction }; 
    } 

    if (destination != null) 
    CopyStoryboardTargetProperties(root, timeline, destination); 

    return destination; 
} 

ボトムライン... VisualStageManagerでは、カラー、ダブル、またはポイントアニメーションのみ使用できます。あなたが何か他のものを必要とするなら、昔ながらのトリガーに戻してください...

+0

迷惑ですが便利です!乾杯。 – GazTheDestroyer

0

ThicknessAnimationステートメントが完全ではない場合があります。MSDNのフローコードサンプルをトピック「ThicknessAnimationクラス」で検索します。

<ThicknessAnimation 
        Storyboard.TargetProperty="BorderThickness" 
        Duration="0:0:1.5" FillBehavior="HoldEnd" From="1,1,1,1" To="28,14,28,14" /> 

これはあなたを助けることができる希望は...

+0

ありがとうございますが、残念ながらこれはアニメーションです。 VisualStatesは既知の状態を設定するため、静的なストーリーボードが必要です。上記をトランジションとして定義できますが、これが私が避けようとしているものです。 – GazTheDestroyer

+0

OK、それは今私のためにはっきりしています –

関連する問題