2014-01-14 2 views
1

XAML라인 애니메이션

<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 나는 마우스를 아래로 두는 첫 번째 점, 두 번째 점은 마우스 위로, 그리는 것은 선이 그려지는 선을 그리려하고있다. 그러나 드래그 할 때 애니메이션 선, 안내선과 같은 애니메이션 선을 표시하려고한다. , 그것을 얻으려면 내가 얻을 수 있도록 마이크로 소프트 페인트처럼 AnimationLine = new Line()을 제거하여 – user1492051

+0

@ user1492051을 제거하고,'canvas_MouseUp'에서 코드를 주석 처리하여 차이가 있는지 확인하십시오 . 또한 마우스 이동 핸들러에서'e.LeftButton'을 체크하지만 마우스 다운 핸들러에서는 체크하지 않으므로 오른쪽 마우스 버튼이 다르게 작동합니다 (의도 한 경우 dunno). – icebat

답변

2

다음과 같이 코드를 단순화 할 수 있습니다. 특히 MouseDownMouseUp 이벤트 대신 MouseLeftButtonDownMouseLeftButtonUp 이벤트에 대한 처리기를 추가해야합니다. 일반적으로 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(); 
} 
관련 문제