1

私は動作する次の方法を持っています。Storyboard を返すユーティリティ メソッドに入れたいと思います。これをストーリーボードに変換する試みはすべて失敗し、調査に多くの時間を費やしました。誰かが私の助けに来ない限り、私はあきらめる準備ができています.

変換したいコードは次のとおりです。

public override void Begin(FrameworkElement element, int duration)
{
    var transform = new ScaleTransform();
    element.LayoutTransform = transform;

    var animation = new DoubleAnimation
                        {
                            From = 1,
                            To = 0,
                            Duration = TimeSpan.FromMilliseconds(duration),
                            FillBehavior = FillBehavior.Stop,
                            EasingFunction = new QuinticEase { EasingMode = EasingMode.EaseIn }
                        };

    transform.BeginAnimation(ScaleTransform.ScaleXProperty, animation);
    transform.BeginAnimation(ScaleTransform.ScaleYProperty, animation);
}

したがって、2 つの BeginAnimation() 呼び出しの代わりに、Storyboard を返したいので、storyboard.Begin() を呼び出すだけです。これがそれほど難しいことではないことはわかっていますが、私はそれを理解していません。

ありがとう。

編集:HBの提案に応えて、次のコードを試しましたが、まだ機能しません:

private static Storyboard CreateAnimationStoryboard(FrameworkElement element, int duration)
{
    var sb = new Storyboard();
    var scale = new ScaleTransform(1, 1);
    element.RenderTransform = scale;
    element.RegisterName("scale", scale);

    var animation = new DoubleAnimation
    {
        From = 1,
        To = 0,
        Duration = TimeSpan.FromMilliseconds(duration),
        FillBehavior = FillBehavior.Stop,
        EasingFunction = new QuinticEase { EasingMode = EasingMode.EaseIn }
    };
    sb.Children.Add(animation);

    Storyboard.SetTarget(animation, scale);
    Storyboard.SetTargetProperty(animation, new PropertyPath(ScaleTransform.ScaleXProperty));

    return sb;
}

私は X 軸だけをアニメーション化したことを知っています。最初に何かを動かしたいだけです。

4

2 に答える 2

0

Expression Blendを使用してそこから記録を開始することをお勧めします。XAML でストーリーボードが作成されるはずです。C# でハード コーディングして 1 つずつストーリーボードに変換しようとするのではなく、エラーが発生しやすい可能性があります。

于 2012-07-30T01:05:45.553 に答える
0

2 つのアニメーションが必要で、添付プロパティを設定して、とStoryboardを使用して、適切なオブジェクトの適切なプロパティをアニメーション化します。SetTargetPropertySetTargetName

ストーリーボードがどのように機能するかにより、namescope( NameScope.SetNameScope) を設定し、変換の名前を登録し、StoryBoard.Beginそれを含む要素 overloadで呼び出す必要があります。

例えば

NameScope.SetNameScope(element, new NameScope());

var transform = new ScaleTransform();
var transformName = "transform";
element.RegisterName(transformName, transform);
element.RenderTransform = transform;

var xAnimation = new DoubleAnimation(2, TimeSpan.FromSeconds(1));
var yAnimation = xAnimation.Clone();

var storyboard = new Storyboard()
{
    Children = { xAnimation, yAnimation }
};

Storyboard.SetTargetProperty(xAnimation, new PropertyPath("(ScaleTransform.ScaleX)"));
Storyboard.SetTargetProperty(yAnimation, new PropertyPath("(ScaleTransform.ScaleY)"));

Storyboard.SetTargetName(xAnimation, transformName);
Storyboard.SetTargetName(yAnimation, transformName);

storyboard.Begin(element);
于 2012-07-29T17:20:27.260 に答える