簡體   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