首页 文章

通过代码WPF完全执行翻转动画

提问于
浏览
4

我尝试将翻转动画添加到我构建的用户控件中 . 用户控件很简单,前后有87x87图像和一些属性 . 我想在我正在努力的游戏中代表一个牌 . 我试图动画用户从牌组中挑选牌的翻转效果 . 我觉得我需要通过代码而不是xaml这样做有两个原因:1 . 在翻转图块后旋转图块(当前正在工作)之后还有另一个变换.2 . 翻转图块后,我想取消该事件 .

我得到的问题只是在方法退出后运行的最后一个动画 . 我想我需要一个故事板,但我看到的所有例子都有两个方面让我困惑:

如何更改图像中间板,以及我将targetProperty设置为什么,我一直在处理这两个博客 .

http://www.codeguru.com/csharp/csharp/cs_misc/userinterface/article.php/c12221 http://blogs.msdn.com/tess/archive/2009/03/16/silverlight-wpf-flipimage-animation.aspx

public void FlipFront()
    {
            DoubleAnimation flipfront = new DoubleAnimation(0, 90, new Duration(new     TimeSpan(0, 0, 1)));
        SkewTransform skew = new SkewTransform();
        this.RenderTransform = skew;
        skew.BeginAnimation(SkewTransform.AngleYProperty, flipfront);         


    }

    public void FlipBack()
    {

        ImageSourceConverter source = new ImageSourceConverter();
        this.ImageFace.Source = new BitmapImage(new Uri("Back.jpg", UriKind.Relative));

        DoubleAnimation flipfront = new DoubleAnimation(90, 0, new Duration(new TimeSpan(0, 0, 1)));
        SkewTransform skew = new SkewTransform();
        this.RenderTransform = skew;
        skew.BeginAnimation(SkewTransform.AngleYProperty, flipfront); 
    }

    public void Flip()
    {
        FlipFront();
        FlipBack();
    }

我打破了两种不同的方法,因为我会帮助解决我遇到的问题 .

1 回答

  • 1

    哇,这还没有在一个很长的时间内更新...以防万一有人跟踪这个:

    问题是你不是在等待“翻转前”动画完成之后立即开始“翻转” - 现在因为你基本上将Y角度动画强制跳跃到90度,这就是为什么它看起来像是不正常射击 .

    有很多方法可以解决这个问题 - 首先想到的是 DoubleAnimation 在它们上面有一个名为 CreateClock 的方法,它会返回一个 AnimationClock 对象 . 该对象上有一个 Completed 事件,它将告诉您该动画何时为"done" . 附上一个处理程序(记住你已经抛出了非常低效的东西,但它会显示原理:

    public AnimationClock StartFlipFrontAnimation()
    {
        this.ImageFace.Source = _frontFace;
        DoubleAnimation flipfront = new DoubleAnimation(0, 90, new Duration(new TimeSpan(0, 0, 3)));
        SkewTransform skew = new SkewTransform();
        this.RenderTransform = skew;
        skew.BeginAnimation(SkewTransform.AngleYProperty, flipfront);
        return flipfront.CreateClock();
    }
    
    public AnimationClock StartFlipBackAnimation()
    {   
        this.ImageFace.Source = _backFace;
        DoubleAnimation flipfront = new DoubleAnimation(90, 0, new Duration(new TimeSpan(0, 0, 3)));
        SkewTransform skew = new SkewTransform();
        this.RenderTransform = skew;
        skew.BeginAnimation(SkewTransform.AngleYProperty, flipfront); 
        return flipfront.CreateClock();
    }
    
    public void BeginFlip()
    {       
        var frontClk = StartFlipFrontAnimation();       
        frontClk.Completed += FrontFlipDone;        
    }
    
    private void FrontFlipDone(object sender, EventArgs args)
    {
        var clk = sender as AnimationClock;
        if(clk != null)
        {
            clk.Completed -= FrontFlipDone;
        }
        var backClk = StartFlipBackAnimation();
    }
    

相关问题