5

次の表示状態が定義されています。

<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>

DoubleAnimationとはColorAnimation正常に動作し、VisualStateManager2 秒以上のトランジション アニメーションが生成されます。

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

トランジションを生成する方法はありますかVisualStateManager、それとも手動でトランジションを提供する必要がありますか?

4

2 に答える 2

3

問題を分析し、 .NET Reflectorを起動したところVisualStateManager、次のアニメーションのみがサポートされていることがわかりました。

  • カラーアニメーション
  • ダブルアニメーション
  • ポイントアニメーション

どこにも文書化されていないので、ちょっとくだらないです。

アニメーションを生成できないことを証明するには、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 では、カラー、ダブル、またはポイント アニメーションのみを使用できます。他に何か必要な場合は、昔ながらのトリガーに戻してください...

于 2014-08-07T11:59:03.630 に答える
0

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

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

これがあなたを助けることを願っています...

于 2012-10-05T14:29:17.863 に答える