2013-04-10 74 views
1

我當前的程序允許用戶單擊一個點,然後單擊另一個點(至少20個像素)並在這兩個點之間繪製一條線。我已經使用了一條折線,這樣可以多次完成。儘管所有行的集合僅在所有的點擊完成後纔出現。實時繪製線到下一個點

void DrawingCanvas_MouseUp(object sender, MouseButtonEventArgs e) { 
     Point position = e.GetPosition(this); 

     if (leftList == null) { 
      //starting a new set 
      leftList.Add(position); 
      lastPoint = position; 
      return; 
     } 
     //calculate distance, i.e. end click 
     double a = lastPoint.X - position.X; 
     double b = lastPoint.Y - position.Y; 
     double distance = Math.Sqrt(a * a + b * b); 
     if (distance > 20) { 
      //continue to add to list 
      leftList.Add(position); 
      lastPoint = position; 
     } else { 
      //end of the line 
      paint(); 
      leftList = new PointCollection(); 
     } 

    } 

    private void paint() { 
     Polyline line = new Polyline(); 
     line.Visibility = System.Windows.Visibility.Visible; 
     line.StrokeThickness = 2; 
     line.Stroke = System.Windows.Media.Brushes.Black; 
     line.Points = leftList; 
     myCanvas.Children.Add(line); 
    } 

所以我的問題是雙重的:

A)我怎麼讓這個之後每按一下新的生產線立即加入。

B)我如何渲染的最後一個點之間的線鼠標光標是目前(即你選擇你的下一個點之前)

回答

2

下面的簡單示例啓動時按下鼠標左鍵並鼠標20的最小距離點移動時,與該按鈕保持按下繪製新的折線。它根據其長度繪製紅色或綠色的最後多段線段(到當前鼠標位置)。如果釋放鼠標按鈕並且新段的長度大於等於20,則會在多段線上附加一個新點。否則,折線將終止,並且可以創建新的折線。

private Polyline polyline; 
private Polyline segment = new Polyline { StrokeThickness = 2 }; 

private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    if (polyline == null) 
    { 
     var canvas = (Canvas)sender; 
     var point = e.GetPosition(canvas); 

     // create new polyline 
     polyline = new Polyline { Stroke = Brushes.Black, StrokeThickness = 2 }; 
     polyline.Points.Add(point); 
     canvas.Children.Add(polyline); 

     // initialize current polyline segment 
     segment.Stroke = Brushes.Red; 
     segment.Points.Add(point); 
     segment.Points.Add(point); 
     canvas.Children.Add(segment); 
    } 
} 

private void Canvas_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (polyline != null) 
    { 
     // update current polyline segment 
     var canvas = (Canvas)sender; 
     segment.Points[1] = e.GetPosition(canvas); 

     var distance = (segment.Points[0] - segment.Points[1]).Length; 
     segment.Stroke = distance >= 20 ? Brushes.Green : Brushes.Red; 
    } 
} 

private void Canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    if (polyline != null) 
    { 
     var canvas = (Canvas)sender; 
     segment.Points[1] = e.GetPosition(canvas); 

     var distance = (segment.Points[0] - segment.Points[1]).Length; 

     if (distance >= 20) 
     { 
      polyline.Points.Add(segment.Points[1]); 
      segment.Points[0] = segment.Points[1]; 
     } 
     else 
     { 
      if (polyline.Points.Count < 2) 
      { 
       canvas.Children.Remove(polyline); 
      } 

      polyline = null; 
      segment.Points.Clear(); 
      canvas.Children.Remove(segment); 
     } 
    } 
} 
+0

太棒了!這些刷子的顏色更好! – Ace 2013-04-11 02:53:38

0

請保持對每次點擊的點的集合。在集合中,您可以添加一個具有StartPoint和EndPoint兩個屬性的類。

第一次點擊鼠標時只是將一個類對象添加到僅有起點的集合中。 當你下次點擊鼠標時,廣告結束時指向該類的最後一個對象,同時創建一個新對象並將該點作爲其起始點並將其添加到集合中,然後調用paint函數。