繁体   English   中英

C#在鼠标移动时绘制折线

[英]C# Draw polyline(s) on mouse move

每当启用 drawing_modeis_drawing布尔值时,我都希望在画布上绘制一些内容。 现在,我正在使用折线列表和BackgroundWorker进行线程化。 我的主要问题是我的代码仅创建一条折线,并且点始终相连。 换句话说,我可以停一会儿绘图,但是无论我单击何处,都会与上一个进行新的线连接。 最终结果是我的canvas.Children的所有点只有一个折线元素。 谁能帮我解决这个问题? PS我还不太擅长穿线...

    private BackgroundWorker drawing_worker;

    private void drawing_worker_ProgressChanged(object sender, ProgressChangedEventArgs eventargs)
    {            

        Polyline polyline = new Polyline();
        polyline.Points = last_polyline.Points;
        canvas.Children.Remove(last_polyline);

        var pos = canvas_relative_pos;
        polyline.Points.Add(pos);
        polyline.Stroke = new SolidColorBrush(Colors.Black);
        polyline.StrokeThickness = 1;
        canvas.Children.Add(polyline);

        last_polyline = polyline;
    }

    private void drawing_worker_DoWork(object sender, DoWorkEventArgs eventargs)
    {
        while (drawing_mode_enabled && is_drawing)
        {
            drawing_worker.ReportProgress(0);
            Thread.Sleep(5);
            if (drawing_worker.CancellationPending) break;
        }
    }

    private void ContentControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        if (drawing_mode_enabled)
        {
            is_drawing = true;

            drawing_worker = new BackgroundWorker
            {
                WorkerReportsProgress = true,
                WorkerSupportsCancellation = true                   
            };

            drawing_worker.ProgressChanged += drawing_worker_ProgressChanged;
            drawing_worker.DoWork += drawing_worker_DoWork;
            drawing_worker.RunWorkerAsync();
        }
    }

您不需要BackgroundWorker或任何其他异步的东西就可以在Canvas上绘制折线。

只需创建一个具有Background的Canvas(以便它获取输入事件)以及MouseLeftButtonDownMouseLeftButtonUpMouseMove事件的处理程序即可:

<Canvas Background="Transparent"
        MouseLeftButtonDown="CanvasMouseLeftButtonDown"
        MouseLeftButtonUp="CanvasMouseLeftButtonUp"
        MouseMove="CanvasMouseMove"/>

在鼠标按下处理程序中,创建一个新的折线并将其添加到“画布”中。 还要捕获鼠标,以便即使鼠标光标离开“画布”也能获得鼠标移动事件。 在鼠标向上处理程序中释放鼠标捕获。 最后,在鼠标移动处理程序中,将点添加到“画布”的最后一个折线子级。

private void CanvasMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    var panel = (Panel)sender;
    var polyline = new Polyline
    {
        Stroke = Brushes.Black,
        StrokeThickness = 3
    };

    panel.Children.Add(polyline);
    panel.CaptureMouse();
}

private void CanvasMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    ((UIElement)sender).ReleaseMouseCapture();            
}

private void CanvasMouseMove(object sender, MouseEventArgs e)
{
    var panel = (Panel)sender;

    if (panel.IsMouseCaptured)
    {
        var polyline = panel.Children.OfType<Polyline>().Last();
        polyline.Points.Add(e.GetPosition(panel));
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM