我使用以下代码在wpf画布上绘制线条,并且我希望能够按下"取消"按钮删除添加的最后一行。
private void Canvas_MouseDown_1(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if (e.ButtonState == MouseButtonState.Pressed) {
currentPoint = e.GetPosition(this);
}
}
private void Canvas_MouseMove_1(object sender, System.Windows.Input.MouseEventArgs e)
{
SolidColorBrush brush = new SolidColorBrush(Colors.Red);
if (e.LeftButton == MouseButtonState.Pressed)
{
Line line = new Line();
line.Stroke = brush;
line.StrokeThickness = 3;
line.X1 = currentPoint.X;
line.Y1 = currentPoint.Y;
line.X2 = e.GetPosition(this).X;
line.Y2 = e.GetPosition(this).Y;
currentPoint = e.GetPosition(this);
paintSurface.Children.Add(line);
}
}
我尝试这样做的方法是从画布中删除孩子(paintSurface),这似乎是要走的路。然而,当我画一条线时,它是由许多小的儿童线(更像是点)组成的,我只能一次擦除它们。这是部分解决方案的样子:
private void button5_Click(object sender, RoutedEventArgs e)
{
if (paintSurface.Children.Count != 0)
paintSurface.Children.RemoveAt(paintSurface.Children.Count - 1);
}
我需要能够得到我绘制的每一行的第一个孩子的索引并存储它们,所以我可以删除所有这些孩子。任何的想法 ?提前谢谢!
编辑:
我找到了一种方法来回答我的问题,但我不会将其标记为答案,因为它非常难看。正如Clemens建议的那样,最好的方法是使用Polylines(他在评论中描述了如何):
在mouseDown上我读取了画布上的子项数,在mouseUp上我再次读取它以了解我的行创建的子项数。我将其添加到列表中,然后当我按下取消按钮时,我会删除与列表中最后一个元素一样多的子项并删除此元素。
它虽然有点像魅力......
答案 0 :(得分:1)
所有细线段的创建都是由检测到鼠标移动的采样率引起的。
解决方案可能是猜测用户想要的单行:
如果其中任何一个超过某个阈值,则可能是两条线之间的逻辑中断。
请注意,为了测量两条线之间的时间,您需要将时间存储在某处,而前两次测量可以在任何给定的序列上完成。
另一种方法是不经常采样: