[英]C# Draw polyline(s) on mouse move
每當啟用 drawing_mode和is_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(以便它獲取輸入事件)以及MouseLeftButtonDown
, MouseLeftButtonUp
和MouseMove
事件的處理程序即可:
<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.