WPF后台代码实现动画

《WPF后台代码实现动画》

一、说明

本文主要讲C#中的WPF如何用后台的代码实现动画

二、主要代码

 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        public class EllipseInfo
        {
            public Ellipse Ellipse { get; set; }

            /// <summary>
            /// Y轴的速度。
            /// </summary>
            public double VelocityY { get; set; }

            public EllipseInfo(Ellipse _ellipse, double _velocityY)
            {
                Ellipse = _ellipse;
                VelocityY = _velocityY;
            }
        }
        private List<EllipseInfo> listEllipse = new List<EllipseInfo>(); //声明一个Ellipse类型的list集合。
        private double acclerationY = 0.1;//Y轴加速度。
        private int minStartingSpeed = 1; //开始时最慢的速度。
        private int maxStartingSpeed = 50; //开始时最快速度。
        private double speedRatio = 0.1;  //速度比率:0.1
        private int minEllipses = 20;   //最少椭圆数量。
        private int maxEllipses = 100;  //最多椭圆数量。
        private int ellipseRadius = 10; //椭圆的半径。
        private bool rendering = false;
        private void CompositionTarget_Rendering(object sender, EventArgs e)
        {
            if (listEllipse.Count == 0)
            {
                int halfCanvasWidth = (int)canvas.ActualWidth / 2;
                Random random = new Random();
                int ellipseCount = random.Next(minEllipses, maxEllipses + 1);
                for (int i = 0; i < ellipseCount; i++)
                {
   Ellipse ellipse = new Ellipse();//创建一个椭圆。                   
   ellipse.Fill = new SolidColorBrush(Colors.LimeGreen);//设置椭圆颜色。
   ellipse.Width = ellipseRadius;//设置椭圆的宽。
   ellipse.Height = ellipseRadius;//设置椭圆的高。
   Canvas.SetLeft(ellipse, halfCanvasWidth + random.Next(-halfCanvasWidth, halfCanvasWidth)); //设置椭圆位置。
   Canvas.SetTop(ellipse, 0); //设置椭圆位置。
   canvas.Children.Add(ellipse); //将创建出来的椭圆加入到canvas面板中。
   EllipseInfo info = new EllipseInfo(ellipse, speedRatio * random.Next(minStartingSpeed, maxStartingSpeed)); //实例化EllipseInfo。
   listEllipse.Add(info); //将创建好的EllipseInfo加入到listEllipse集合中。
                }
            }
            else
            {
                for (int i = listEllipse.Count - 1; i >= 0; i--)
                {
         EllipseInfo info = listEllipse[i]; //得到椭圆。                   
         double top = Canvas.GetTop(info.Ellipse);//得到top坐标值。
         Canvas.SetTop(info.Ellipse, top + 1 * info.VelocityY);
                if (top >= canvas.ActualHeight - ellipseRadius * 2 - 10)
                    {
                        listEllipse.Remove(info);
                    }
                    else
                    {
                        info.VelocityY += acclerationY;
                    }
                    if (listEllipse.Count == 0)
                    {
                        StopRendering();
                    }
                }
            }
        }
        //取消关联事件处理程序。
        private void StopRendering()
        {
            CompositionTarget.Rendering -= CompositionTarget_Rendering;
            rendering = false;
        }

        //开始按钮
        private void btnStart_Click(object sender, RoutedEventArgs e)
        {
            if (rendering == false)
            {
                listEllipse.Clear();
                canvas.Children.Clear();
                CompositionTarget.Rendering += CompositionTarget_Rendering;
                rendering = true;
            }
        }
        //停止按钮
        private void btnStop_Click(object sender, RoutedEventArgs e)
        {
            StopRendering();
        }
    }

三、效果图

点击开始按钮后变化过程为:由图一渐变为图二再由图二渐变为图三。
在这里插入图片描述
图一
在这里插入图片描述
图二

在这里插入图片描述
图三

四、总结

很多数据和功能的处理也是如此,功能的实现不仅仅可以通过前台,也可以通过后台去实现。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页