2014-01-14 53 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(); 
}