c# - 通过 MouseDown 创建一个圆并移动它

标签 c# wpf geometry event-listener

我用 C# 用 wpf 编写了一个小应用程序。我的目标是在图片中画一个圆圈。只要按下鼠标按钮,圆圈就应该可以移动,只有在用户释放鼠标按钮后,圆圈才会最终绘制出来。为了绘制椭圆,我使用 DrawEllipse。

                    grf.DrawEllipse(
                    myPen,                                      
                    (float)xOriginal - 25,     
                    (float)yOriginal - 25,     
                    radius,                            
                    radius                      
                    );

松开鼠标后,应该绘制圆。然后我想提取坐标并保存。

我的想法是使用 MouseDown、MouseMove 和 MouseUp。 MouseDown 注册点击。使用 MouseMove 时,每次都应重新绘制圆圈,而使用 MouseUp 时,应最终绘制圆圈。

我的问题是,使用 MouseMove 时,圆圈被一次又一次地绘制,但没有被删除。此外,它的延迟令人难以置信。有没有更好的解决方案

这是我快速而肮脏的代码片段:

        bool registerClick = false;

    private void Image_imageBox_MouseregisterClick(object sender, MouseButtonEventArgs e)
    {
        registerClick = true;
    }

    private void Image_imageBox_MouseMove(object sender, MouseEventArgs e)
    {
        if (registerClick)
        {
            Pen myPen = new Pen(Color.FromArgb(255, 0, 0, 0), 10);
            int radius = 50;
            Bitmap b1 = _detektion.BildOriginal.Bitmap;

            using (Graphics grf = Graphics.FromImage(b1))
            {
                // zeichne denkreis ein
                grf.DrawEllipse(
                    myPen,                                      
                    ((float)e.GetPosition(imageBox_Image).X - 25,     
                    (float)e.GetPosition(imageBox_Image).X - 25,     
                    radius,                         
                    radius                      
                    );
            }

            imageBox_Image.Source = DGX_Body.Utility.Images.ConvertBitmapToBitmapImage(b1);
        }
    }

    private void Image_imageBox_MouseUp(object sender, MouseButtonEventArgs e)
    {
        Console.WriteLine("Up!");
        registerClick = false;
    }

你能帮帮我吗? 谢谢

最佳答案

这是一个非常基本的示例,在使用鼠标输入的 Canvas 中使用椭圆。

XAML:

<Grid>
    <Image Source="C:\Users\Public\Pictures\Sample Pictures\Koala.jpg"
           Stretch="None" HorizontalAlignment="Left" VerticalAlignment="Top"/>
    <Canvas Background="Transparent"
            MouseLeftButtonDown="CanvasMouseLeftButtonDown"
            MouseLeftButtonUp="CanvasMouseLeftButtonUp"
            MouseMove="CanvasMouseMove"/>
</Grid>

带有事件处理程序的代码:

private Ellipse currentEllipse;

private void CanvasMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    var canvas = (Canvas)sender;
    var pos = e.GetPosition(canvas);
    canvas.CaptureMouse();

    currentEllipse = new Ellipse
    {
        Width = 50,
        Height = 50,
        Margin = new Thickness(-25, -25, 0, 0),
        Stroke = Brushes.White,
        StrokeThickness = 3
    };

    Canvas.SetLeft(currentEllipse, pos.X);
    Canvas.SetTop(currentEllipse, pos.Y);
    canvas.Children.Add(currentEllipse);
}

private void CanvasMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    var canvas = (Canvas)sender;
    canvas.ReleaseMouseCapture();
    currentEllipse = null;
}

private void CanvasMouseMove(object sender, MouseEventArgs e)
{
    if (currentEllipse != null)
    {
        var canvas = (Canvas)sender;
        var pos = e.GetPosition(canvas);

        Canvas.SetLeft(currentEllipse, pos.X);
        Canvas.SetTop(currentEllipse, pos.Y);
    }
}

通过这个小改动,您还可以选择现有的椭圆:

private void CanvasMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    var canvas = (Canvas)sender;
    var pos = e.GetPosition(canvas);
    canvas.CaptureMouse();

    currentEllipse = e.OriginalSource as Ellipse;

    if (currentEllipse == null)
    {
        currentEllipse = new Ellipse
        {
            Width = 50,
            Height = 50,
            Margin = new Thickness(-25, -25, 0, 0),
            Fill = Brushes.Transparent,
            Stroke = Brushes.White,
            StrokeThickness = 3
        };

        canvas.Children.Add(currentEllipse);
    }

    Canvas.SetLeft(currentEllipse, pos.X);
    Canvas.SetTop(currentEllipse, pos.Y);
}

关于c# - 通过 MouseDown 创建一个圆并移动它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51823624/

相关文章:

c# - 如何从 emgu cv 中的网络摄像头获取视频流?

带有 DataTemplates 的 WPF ListBoxItems - 如何从 DataTemplate 中引用绑定(bind)到 ListBoxItem 的 CLR 对象?

algorithm - 是否有一种算法可以分离共享一条边的多边形?

c# - 如何判断一个点在立方体内部还是外部?

c# - 哈希表/字典冲突

c# - Service Fabric 应用程序中的静态变量范围

c# - web.config 转换 - 从 connectionstring 部分删除注释

c# - 使用 System.ComponentModel.DataAnnotations.Validator 验证属性

c# - 重用具有不同 ViewModel 的 usercontrol(View)

algorithm - 找到具有给定点数的最小包含凸多边形