2016-10-06 8 views
0

Canvasに四角形を描画するコードがあります。しかし、このすべては素晴らしいですが、マウスがCanvasの境界を離れると、矩形の描画がフリーズして何も起こりません。いくつかは、コードマウスがキャンバス境界の外側に移動した場合の矩形の描画方法

<Canvas x:Name="canvas" MouseDown="Canvas_MouseDown" MouseMove="Canvas_MouseMove" MouseUp="Canvas_MouseUp" Background="Transparent" /> 
private Point startPoint; 
private Rectangle rect; 

private void Canvas_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    startPoint = e.GetPosition(canvas); 

    rect = new Rectangle 
    { 
     Stroke = Brushes.LightBlue, 
     StrokeThickness = 2 
    }; 
    Canvas.SetLeft(rect,startPoint.X); 
    Canvas.SetTop(rect,startPoint.X); 
    canvas.Children.Add(rect); 
} 

private void Canvas_MouseMove(object sender, MouseEventArgs e) 
{ 
    if(e.LeftButton == MouseButtonState.Released || rect == null) 
     return; 

    var pos = e.GetPosition(canvas); 

    var x = Math.Min(pos.X, startPoint.X); 
    var y = Math.Min(pos.Y, startPoint.Y); 

    var w = Math.Max(pos.X, startPoint.X) - x; 
    var h = Math.Max(pos.Y, startPoint.Y) - y; 

    rect.Width = w; 
    rect.Height = h; 

    Canvas.SetLeft(rect, x); 
    Canvas.SetTop(rect, y); 
} 

private void Canvas_MouseUp(object sender, MouseButtonEventArgs e) 
{ 
    rect = null; 
} 

私は何をしたいが、私は外側Canvasの境界を行く場合でも、継続して矩形に描画するが、明らかにクリッピング矩形の大きさのためでありますCanvasの境界。

これを達成する最も良い方法は何ですか?

答えて

2

あなたはMouseDownイベントハンドラ

private void Canvas_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    canvas.CaptureMouse(); 
    ... 
} 

でマウスをキャプチャし、MouseUpイベントハンドラでキャプチャを解放する必要があります

private void Canvas_MouseUp(object sender, MouseButtonEventArgs e) 
{ 
    ... 
    canvas.ReleaseMouseCapture(); 
} 
関連する問題