保存圆圈并再次在WPF代码Behind的下一行输出

时间:2015-09-07 20:02:42

标签: wpf animation draw ellipse

我想复制这个圈子。

2.单击开始动画按钮时,动画仅运行一次。

复制下面的圆圈。

然后,我失败了。这是结果。

我不知道你为什么失败了。我无法上传照片。

所以我提出了所有的代码。

我想要结果......这个 ex)10 1 2 3 4 5 6 9 8 7(各种尺寸的圆,一行)

开始动画只运行一次 - > 打印一个新的圆圈
10 1 2 3 4 5 6 9 8 7

1 10 2 3 4 5 6 9 8 7(新线)

每次单击按钮时添加新来源。

颜色转换是动画,移动点。

public partial class MainWindow : Window
{
    int num_count = 10;  // use data number
    List<int> sampleNumbers;    // Save a number to use for sorting
    Ellipse[] Circle;

    List<Ellipse> SaveCircleInfos = new List<Ellipse>();

    // save changed sorting info
    struct SortingTraceInfo
    {
        public int Position;    // change position
        public int TargetPosition;  // will change position
        public int[] SortingNumbers;    // sorting numbers
    }

    // save changed sorting info 
    List<SortingTraceInfo> sortingInfos;
    int sortingInfosIndex;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void num_bt_Click(object sender, RoutedEventArgs e)
    {
        Random _random = new Random(); // create number
        int[] num = new int[num_count];
        sampleNumbers = new List<int>();

        for (int i = 0; i < num_count; i++)
        {
            num[i] = _random.Next(1, 50);
            sampleNumbers.Add(num[i]);   // save number data
            rtb.AppendText(num[i].ToString() + "\r\n");
        }
        BubbleSort();
        drawCircle(num_count, sampleNumbers);
    }

    //create number button
    private void draw_bt_Click(object sender, RoutedEventArgs e)
    {
        // draw a path and start animation
        SortingTraceInfo traceInfo = this.sortingInfos[this.sortingInfosIndex++];

        draw_path(traceInfo.Position, traceInfo.TargetPosition);

        if (sortingInfos.Count <= sortingInfosIndex)
        {
            start.IsEnabled = false;
        }
    }

    //reprint circle
    private void rePrint(List<Ellipse> circles)
    {
        int location = ((685 / SaveCircleInfos.Count) - 5); // circle startpoint
        int x = 50;

        for (int i = 0; i < num_count; i++)
        {
            SaveCircleInfos[i].Stroke = Brushes.Red;

            Canvas.SetLeft(SaveCircleInfos[i], x); // startpoint x-axis
            Canvas.SetTop(SaveCircleInfos[i], 230); // startpoint Y-axis

            x += location;
        }
    }

    // draw circle
    private void drawCircle(int num, List<int> size)
    {
                   // To create the circle by the number of input num
        Circle = new Ellipse[num];
        int location = ((685 / num) - 5); // circle startpoint

        int x = 50; // Width
        int y = 115; // Height

        for (int i = 0; i < num; i++)
        {
            double circlesize = size[i] + 15;
            double radius = circlesize / 2; // radius
            double st_posX = x - radius;    // circular X-axis position
            double st_posY = y - radius;    // circular Y-axis position

            // define circle property
            Circle[i] = new Ellipse();
            Circle[i].Name = "circle" + i.ToString();
            Circle[i].Stroke = Brushes.Red;
            Circle[i].StrokeThickness = 5;
            Circle[i].Width = circlesize;
            Circle[i].Height = circlesize;
            SaveCircleInfos.Add(Circle[i]);

            // position of canvs
            Canvas.SetLeft(Circle[i], st_posX); // startpoint x-axis
            Canvas.SetTop(Circle[i], st_posY); // startpoint Y-axis

            // startpoint 
            x += location;

            // add canvas
            canvas.Children.Add(Circle[i]);
        }
    }

    private void draw_path(int pos1, int pos2)
    {
        var circles = canvas.Children.OfType<Ellipse>().OrderBy(q => (double)q.GetValue(Canvas.LeftProperty)).ToList();

        var circle1 = circles[pos1];
        var circle2 = circles[pos2];

        circle1.Stroke = Brushes.Blue;
        circle2.Stroke = Brushes.Purple;

        // horizontal animation for circle1
        Storyboard sb1 = new Storyboard();
        double from1 = (double)circle1.GetValue(Canvas.LeftProperty);
        double to1 = (double)circle2.GetValue(Canvas.LeftProperty) + circle2.ActualWidth / 2 - circle1.ActualWidth / 2;
        DoubleAnimation da1 = new DoubleAnimation(from1, to1, new Duration(TimeSpan.FromSeconds(0.6)));

        Storyboard.SetTarget(sb1, circle1);
        Storyboard.SetTargetProperty(sb1, new PropertyPath(Canvas.LeftProperty));

        sb1.Children.Add(da1);

        // horizontal animation for circle2
        Storyboard sb2 = new Storyboard();
        double from2 = (double)circle2.GetValue(Canvas.LeftProperty);
        double to2 = (double)circle1.GetValue(Canvas.LeftProperty) + circle1.ActualWidth / 2 - circle2.ActualWidth / 2;
        DoubleAnimation da2 = new DoubleAnimation(from2, to2, new Duration(TimeSpan.FromSeconds(0.6)));

        Storyboard.SetTarget(sb2, circle2);
        Storyboard.SetTargetProperty(sb2, new PropertyPath(Canvas.LeftProperty));

        sb2.Children.Add(da2);

        // vertical animation for circle1
        Storyboard sb3 = new Storyboard();
        double from3 = (double)circle1.GetValue(Canvas.TopProperty);
        double to3 = (double)circle1.GetValue(Canvas.TopProperty) + circle1.ActualWidth;
        DoubleAnimation da3 = new DoubleAnimation(from3, to3, new Duration(TimeSpan.FromSeconds(0.3)));
        da3.AutoReverse = true;
        da3.AccelerationRatio = 0.1;

        Storyboard.SetTarget(sb3, circle1);
        Storyboard.SetTargetProperty(sb3, new PropertyPath(Canvas.TopProperty));

        sb3.Children.Add(da3);

        // vertical animation for circle2
        Storyboard sb4 = new Storyboard();
        double from4 = (double)circle2.GetValue(Canvas.TopProperty);
        double to4 = (double)circle2.GetValue(Canvas.TopProperty) - circle2.ActualWidth;
        DoubleAnimation da4 = new DoubleAnimation(from4, to4, new Duration(TimeSpan.FromSeconds(0.3)));
        da4.AutoReverse = true;
        da4.AccelerationRatio = 0.1;

        Storyboard.SetTarget(sb4, circle2);
        Storyboard.SetTargetProperty(sb4, new PropertyPath(Canvas.TopProperty));

        sb4.Children.Add(da4);

        sb1.Begin();
        sb2.Begin();
        sb3.Begin();
        sb4.Begin();

        var temp = SaveCircleInfos[pos1];
        SaveCircleInfos[pos1] = SaveCircleInfos[pos2];
        SaveCircleInfos[pos2] = temp;

        rePrint(SaveCircleInfos);
    }

    // bubble sort
    private List<int> BubbleSort()
    {
        sortingInfos = new List<SortingTraceInfo>();
        List<int> sorting = new List<int>(sampleNumbers);

        for (int i = 0; i < sorting.Count - 1; i++)
        {
            for (int j = 0; j < sorting.Count - 1 - i; j++)
            {
                if (sorting[j] > sorting[j + 1])
                {
                    Swap(sorting, j, j + 1);
                    SortingTraceInfo sortInfo = new SortingTraceInfo(); // 
                    sortInfo.Position = j;  // save change position
                    sortInfo.TargetPosition = j + 1;    // save will change position
                    sortInfo.SortingNumbers = sorting.ToArray();   // sorting number saved to array 
                    sortingInfos.Add(sortInfo); 
                }
            }
        }
        return sorting;
    }

    private void Swap(List<int> num, int i, int j)
    {
        int temp = num[i];
        num[i] = num[j];
        num[j] = temp;
    }
  }
}

0 个答案:

没有答案