2014-01-14 55 views
1

XAML动画的线,而在WPF绘制

<Canvas Name="canvas" MouseDown="canvas_MouseDown" MouseUp="canvas_MouseUp" Background="White" MouseMove="canvas_MouseMove" /> 

C#

Line AnimationLine; 
Point P1; 
private void canvas_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    P1 = e.GetPosition(canvas); 
    AnimationLine = new Line() { Stroke = new SolidColorBrush { Color = Colors.Blue },StrokeThickness = 3}; 
    AnimationLine.X1 = P1.X; 
    AnimationLine.Y1 = P1.Y; 
    canvas.Children.Add(AnimationLine); 
} 


private void canvas_MouseUp(object sender, MouseButtonEventArgs e) 
{ 
    var P2 = e.GetPosition(canvas); 
    canvas.Children.Remove(AnimationLine); 
    //AnimationLine = new Line(); 
    canvas.Children.Add 
     (new Line() 
     { 
      X1 = P1.X, 
      Y1 = P1.Y, 
      X2 = P2.X, 
      Y2 = P2.Y, 
      StrokeThickness = 3, 
      Stroke = new SolidColorBrush { Color = Colors.Blue } 
     }); 
} 

private void canvas_MouseMove(object sender, MouseEventArgs e) 
{ 
    if(e.LeftButton == MouseButtonState.Pressed) 
    { 
     var P2 = e.GetPosition(canvas); 
     AnimationLine.X2 = P2.X; 
     AnimationLine.Y2 = P2.Y; 
    } 
} 

我试图绘制分配上鼠标向下一行第一点,分配在鼠标弹起并且那当所述第二点线被绘制,但是当拖动时我想要显示动画线,动画线就像是一个实时指引线。

为了得到它我想绘制一条线就像在微软的油漆。

我刚刚写了上面的内容,它的效果很好,但这真的是这样做的方式吗?任何内置的功能可以帮助?

+1

这取决于你正在努力实现的,你有没有在所有的解释什么。你刚才展示了你的代码让我们猜测它应该做什么。无论如何,对我来说,你似乎创造了比实际需要更多的Line对象。为什么在'canvas_MouseUp'中分配'AnimationLine = new Line()'? – Clemens

+0

@Clemens我想绘制一个线在鼠标下分配的第一个点,第二个点分配在鼠标上,这是当线被绘制,但当拖动我想显示动画线,动画线就像一个指导线,为了得到它,我想绘制一条线,就像在Microsoft Paint中一样,AnimationLine = new Line(),以便它被移除 – user1492051

+0

@ user1492051,尝试将'canvas_MouseUp'中的代码注释掉,看看是否有任何区别。此外,您在鼠标移动处理程序中检查“e.LeftButton”,但不在鼠标下移处理程序中,因此右键单击按钮的行为不同(不知道是否有意)。 – icebat

回答

2

您的代码可以简化,如下所示。特别是您应该为MouseLeftButtonDownMouseLeftButtonUp事件添加处理程序,而不是更常规的MouseDownMouseUp事件。另请注意,您通常会使用capture the mouse,并且具有鼠标上移处理程序的唯一目的是释放鼠标捕获。

XAML:

<Canvas Background="Transparent" 
     MouseLeftButtonDown="Canvas_MouseLeftButtonDown" 
     MouseLeftButtonUp="Canvas_MouseLeftButtonUp" 
     MouseMove="Canvas_MouseMove"/> 

后面的代码:

private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    var canvas = (Canvas)sender; 

    if (canvas.CaptureMouse()) 
    { 
     var startPoint = e.GetPosition(canvas); 
     var line = new Line 
     { 
      Stroke = Brushes.Blue, 
      StrokeThickness = 3, 
      X1 = startPoint.X, 
      Y1 = startPoint.Y, 
      X2 = startPoint.X, 
      Y2 = startPoint.Y, 
     }; 

     canvas.Children.Add(line); 
    } 
} 

private void Canvas_MouseMove(object sender, MouseEventArgs e) 
{ 
    var canvas = (Canvas)sender; 

    if (canvas.IsMouseCaptured && e.LeftButton == MouseButtonState.Pressed) 
    { 
     var line = canvas.Children.OfType<Line>().LastOrDefault(); 

     if (line != null) 
     { 
      var endPoint = e.GetPosition(canvas); 
      line.X2 = endPoint.X; 
      line.Y2 = endPoint.Y; 
     } 
    } 
} 

private void Canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    ((Canvas)sender).ReleaseMouseCapture(); 
}