[英]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.