取消在wpf画布上绘制的一条线(C#)

时间:2015-07-23 12:35:48

标签: c# wpf canvas

我使用以下代码在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上我再次读取它以了解我的行创建的子项数。我将其添加到列表中,然后当我按下取消按钮时,我会删除与列表中最后一个元素一样多的子项并删除此元素。

它虽然有点像魅力......

1 个答案:

答案 0 :(得分:1)

所有细线段的创建都是由检测到鼠标移动的采样率引起的。

解决方案可能是猜测用户想要的单行:

  • 通过测量每个微小行程的长度
  • 两条相邻线之间的角度
  • 绘制两条相邻线之间的时间

如果其中任何一个超过某个阈值,则可能是两条线之间的逻辑中断。

请注意,为了测量两条线之间的时间,您需要将时间存储在某处,而前两次测量可以在任何给定的序列上完成。

另一种方法是不经常采样:

  • 如果鼠标没有移动那么多,除非鼠标改变方向,否则不要添加一行