2015-07-23 11 views
0

Я использую следующий код, чтобы нарисовать линию на холсте wpf, и я бы хотел нажать кнопку «отменить», чтобы удалить последнюю добавленную строку ,Отмените линию, нарисованную на холсте wpf (C#)

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); 
} 

я должен был бы быть в состоянии получить индекс первого ребенка каждой строки я рисую и хранить их, так что я могу стереть все дети после этого. Есть идеи ? Заранее спасибо !

EDIT:

Я нашел способ, чтобы ответить на мою проблему, но я не буду отмечать его в ответ, как это очень некрасиво. Лучшим способом было бы, как предложил Клеменс, использовать Polylines (он описывает, как в комментарии):

На mouseDown Я прочитал количество детей на холсте, на mouseUp Я прочитал его снова, чтобы узнать количество детей моя линия создана. Я добавляю это в список, затем, когда я нажимаю кнопку отмены, я удаляю столько же детей, сколько последний элемент моего списка и удаляю этот элемент.

Он работает как шарм, хотя ...

+1

Вместо добавления отдельных объектов Line при перемещении мыши вы должны создать Polyline на мыши вниз и добавить точки к Polyline при перемещении мыши. При стирании вы просто удалите последний дочерний элемент Polyline с Canvas. – Clemens

+0

О, это похоже на хорошую идею. Я постараюсь сделать это. –

+0

Вам даже не нужно держать 'currentPoint' :-) – Clemens

ответ

1

Создание всех маленьких сегментов линии обусловлена ​​частотой дискретизации, при котором обнаруживается движение мыши.

Раствор может быть угадать, что пользователь намеревался в виде одной строки:

  • пути измерения длины каждого крошечного инсульта
  • угла между двумя соседними линиями
  • времени между чертежом двух соседних линий

Если какой-либо из них превышает определенный порог, это может быть логический разрыв между двумя линиями.

Обратите внимание, что для измерения времени между двумя линиями вам нужно будет хранить время где-то, тогда как первые два измерения могут быть выполнены в любой заданной последовательности.

Другой способ заключается в отборе проб реже:

  • , если мышь не двигалась, что много, не добавить строку еще, если мышь не изменил направление
+0

Честно говоря, что будет слишком сложно для меня ;-) Как насчет того, чтобы подождать, пока кнопка мыши будет идти от нажатых до нажатых и Я знаю, что это начало линии? Есть ли такое событие? –

+0

MouseLeftButtonDown/MouseLeftButtonUp? –

+0

Да, это может сделать это, я попробую, что предложил Клеменс и использовал полилинию –

Смежные вопросы