如何在可拖动的canvas上制作矩形?

我有这三个函数来触发事件。 我已经有了我需要的静态版本,但我需要它的动态版本。

bool captured = false; double x_shape, x_canvas, y_shape, y_canvas; UIElement source = null; private void MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { source = (UIElement)sender; Mouse.Capture(source); captured = true; x_shape = Canvas.GetLeft(source); x_canvas = e.GetPosition(canvasPreview).X; y_shape = Canvas.GetTop(source); y_canvas = e.GetPosition(canvasPreview).Y; } private void MouseMove(object sender, MouseEventArgs e) { //MessageBox.Show("test"); if (captured) { double x = e.GetPosition(canvasPreview).X; double y = e.GetPosition(canvasPreview).Y; x_shape += x - x_canvas; Canvas.SetLeft(source, x_shape); x_canvas = x; y_shape += y - y_canvas; Canvas.SetTop(source, y_shape); y_canvas = y; } } private void MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { Mouse.Capture(null); captured = false; } 

我在WPF中制作了一个名为“canvasPreview”的canvas,我想在canvas中添加矩形(目前在静态版本中使用椭圆),它必须可以使用上述函数进行拖动。 它已经在运行,但它必须是动态的。

希望你能帮助我,提前谢谢你!

我相信这个示例代码会对您有所帮助。

XAML:

             

C#:

  bool drag = false; Point startPoint; public MainWindow() { InitializeComponent(); } // this creates and adds rectangles dynamically private void addRectangleButton_Click(object sender, RoutedEventArgs e) { // create new Rectangle Rectangle rectangle = new Rectangle(); // assign properties rectangle.Width = 100; rectangle.Height = 50; rectangle.Fill = new SolidColorBrush(Colors.RoyalBlue); // assign handlers rectangle.MouseDown += rectangle_MouseDown; rectangle.MouseMove += rectangle_MouseMove; rectangle.MouseUp += rectangle_MouseUp; // set default position Canvas.SetLeft(rectangle, 0); Canvas.SetTop(rectangle, 0); // add it to canvas canvas.Children.Add(rectangle); } private void rectangle_MouseDown(object sender, MouseButtonEventArgs e) { // start dragging drag = true; // save start point of dragging startPoint = Mouse.GetPosition(canvas); } private void rectangle_MouseMove(object sender, MouseEventArgs e) { // if dragging, then adjust rectangle position based on mouse movement if (drag) { Rectangle draggedRectangle = sender as Rectangle; Point newPoint = Mouse.GetPosition(canvas); double left = Canvas.GetLeft(draggedRectangle); double top = Canvas.GetTop(draggedRectangle); Canvas.SetLeft(draggedRectangle, left + (newPoint.X - startPoint.X)); Canvas.SetTop(draggedRectangle, top + (newPoint.Y - startPoint.Y)); startPoint = newPoint; } } private void rectangle_MouseUp(object sender, MouseButtonEventArgs e) { // stop dragging drag = false; }