Move a rectangle around a canvas

前端 未结 2 1968
清歌不尽
清歌不尽 2021-01-25 06:42

I have a canvas in the middle of my application with controls around it. I have a socket that recieves Points and saves them in a list.

I draw small 4x4 rectangles on th

2条回答
  •  渐次进展
    2021-01-25 07:09

    I think more nifty solutions are available through binding the Canvas.Left and Canvas.Top attached properties to a ObservableCollection>, but as you asked for an old fashioned WinForms Style solution here you have something that does what I think you need (My apologies for writing this in C#):

    XAML:

    
        
            
                
            
            
            
            
        
    
    

    Code behind:

    using System;
    using System.Collections.Generic;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media;
    using System.Windows.Shapes;
    
    namespace MovingPointsSpike
    {
    
        public partial class MainWindow : Window
        {
            private List m_Points;
            private Random m_Random;
    
            public MainWindow()
            {
                InitializeComponent();
                m_Points=new List();
                m_Random=new Random();
            }
    
            private void Move_Click(object sender, RoutedEventArgs e)
            {
                Rectangle rectangle;
                Point newPoint;
                int index = GetRandomIndex();
                newPoint = GetRandomPoint();
    
                rectangle =(Rectangle)PointCanvas.Children[index];
                if (index == -1) return;
                Canvas.SetTop(rectangle, newPoint.Y);
                Canvas.SetLeft(rectangle, newPoint.X);
            }
    
            private void Add_Click(object sender, RoutedEventArgs e)
            {
                Point newPoint;
                Rectangle rectangle;
    
                newPoint = GetRandomPoint();
                rectangle = new Rectangle {Width = 4, Height = 4, Fill = Brushes.Red};
                m_Points.Add(newPoint);
                PointCanvas.Children.Add(rectangle);
                Canvas.SetTop(rectangle,newPoint.Y);
                Canvas.SetLeft(rectangle,newPoint.X);
            }
    
            private Point GetRandomPoint()
            {
                int x;
                int y;
                x = m_Random.Next(10, 490);
                y = m_Random.Next(10, 490);
                return new Point(x,y);
            }
    
            private void Remove_Click(object sender, RoutedEventArgs e)
            {
                int index = GetRandomIndex();
                if (index==-1)return;
    
                PointCanvas.Children.RemoveAt(index);
                m_Points.RemoveAt(index);
    
            }
    
            private int GetRandomIndex()
            {
                int index;
                if (m_Points.Count==0) return -1;
                index = m_Random.Next(m_Points.Count - 1);
                return index;
            }
        }
    }
    

提交回复
热议问题