如何在可拖动的画布上制作矩形? [英] How can I make a Rectangle on a canvas which is draggable?

查看:61
本文介绍了如何在可拖动的画布上制作矩形?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我具有这三个函数来触发事件.我已经有一个静态版本的需求,但是我需要一个动态版本.

    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"的画布,我想将矩形(当前在使用椭圆的静态版本中)添加到画布中,必须使用上述功能将其拖动.它已经在工作,但必须动态.

I have made a canvas in WPF called 'canvasPreview', I want to add the rectangle (currently in the static version I am using an ellipse) to the canvas, it must be draggable with above functions. It is already working, but it have to be dynamically.

希望您能帮助我,谢谢您!

I hope you can help me, thank you in advance!

推荐答案

我确信此示例代码将为您提供帮助.

I'm sure this sample code will help you.

XAML:

<Grid Margin="12">
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <StackPanel Grid.Row="0" Orientation="Horizontal">
        <Button x:Name="addRectangleButton" Content="Add Rectngle" Click="addRectangleButton_Click"/>
    </StackPanel>

    <Canvas Grid.Row="1" x:Name="canvas" Margin="0,12,0,0">
        <Rectangle x:Name="rectangle" Width="100" Height="50" Fill="RoyalBlue" MouseDown="rectangle_MouseDown" MouseMove="rectangle_MouseMove" MouseUp="rectangle_MouseUp" Canvas.Left="0" Canvas.Top="0"/>
    </Canvas>
</Grid>

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;
    }

这篇关于如何在可拖动的画布上制作矩形?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆