1

xamlの代わりに、コードビハインドで「古い学校」の方法をアニメーション化することは可能ですか?

自分のforループで簡単に実行できる「バウンス効果」のあるものを指す矢印が必要です。しかし、ループ内でリフレッシュする方法やタイマー遅延を行う方法がわかりません。私はすでに画像をコードビハインドの所定の位置に配置しました。私がやりたいのはこの単純なアニメーションだけです...

public void validationArrow()
{

    var validationArrow = new Image();
    validationArrow.Source = new BitmapImage(new Uri("/SlProject;component/arrow.png", UriKind.RelativeOrAbsolute));
    LayoutRoot.Children.Add(validationArrow);
    validationArrow.Stretch = Stretch.None;
    validationArrow.VerticalAlignment = System.Windows.VerticalAlignment.Top;
    validationArrow.HorizontalAlignment = System.Windows.HorizontalAlignment.Left;
    var arrowPosition = new TranslateTransform { X = 0, Y = 0 };
    validationArrow.RenderTransform = arrowPosition;

    validationArrow.Name = "validationArrow";

    for (int i = 150; i >= 0; i--)
    {
        arrowPosition.X = i;
        validationArrow.RenderTransform = arrowPosition;
        // how can I refresh screen and do some timing here?
    }
}
4

1 に答える 1

3

古い学校のような学校はありません;)ここで、これはあなたの途中であなたを助けるはずです。BuildEasingメソッドに渡されるミリ秒とYの変換値を試して、「バウンス」エフェクトの速度と距離を変更できます。

    private void RunStoryboard()
    {
        var arrowImage = new Image();
        arrowImage.RenderTransform = new CompositeTransform();
        arrowImage.Source = new BitmapImage(new Uri("/SlProject;component/arrow.png", UriKind.RelativeOrAbsolute));
        LayoutRoot.Children.Add(arrowImage);

        Storyboard storyboard = new Storyboard();
        storyboard.Children.Add(BuildKeyFrame(arrowImage));
        storyboard.Begin();
    }

    private DoubleAnimationUsingKeyFrames BuildKeyFrame(Image target)
    {
        DoubleAnimationUsingKeyFrames kf = new DoubleAnimationUsingKeyFrames();
        Storyboard.SetTarget(kf, target);
        Storyboard.SetTargetProperty(kf, new PropertyPath("(UIElement.RenderTransform).(CompositeTransform.TranslateY)"));

        kf.KeyFrames.Add(BuildEasing(100, 10));
        kf.KeyFrames.Add(BuildEasing(200, 0));
        kf.KeyFrames.Add(BuildEasing(300, 10));
        kf.KeyFrames.Add(BuildEasing(400, 0));
        kf.KeyFrames.Add(BuildEasing(500, 10));
        kf.KeyFrames.Add(BuildEasing(600, 0));

        return kf;
    }

    private EasingDoubleKeyFrame BuildEasing(int ms, int value)
    {
        return new EasingDoubleKeyFrame()
        {
            KeyTime = KeyTime.FromTimeSpan(new TimeSpan(0, 0, 0, 0, ms)),
            Value = value
        };
    }
于 2012-04-12T02:52:18.823 に答える