2017-11-21 8 views
0

私はWPFを初めて使用しています。WPF Circle on Mouseイベントを描画する方法

マウスの移動イベントでキャンバスに円を描きたいと思います。私はすでにそれをキャンバスの周りにドラッグするロジックを書いています。しかし、キャンバス上をマウスがクリックしたときに円を作成したいと思っていました。キャンバス上でのマウスの移動に合わせてサイズを変更する必要がありました。

どうすればこの問題を解決できますか?

は、ここに私のコードのそれは一度だけあなたのリスナーを添付する方が良いでしょう

Ellipse elip = new Ellipse(); 
    private double pointx; 
    private double pointy;   

    private void canvas_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
    { 
     canvas.MouseMove -= MouseMove_NotDown; 
     canvas.MouseMove += canvas_PreviewMouseMove; 
     canvas.MouseUp += canvas_PreviewMouseUp; 

     Point location = e.MouseDevice.GetPosition(canvas); 
     elip = new Ellipse(); 
     elip.Height = 1; 
     elip.Width = 1; 
     elip.Stroke = Brushes.Black; 
     elip.StrokeThickness = 2; 
     Canvas.SetTop(elip, location.Y + 1); 
     Canvas.SetLeft(elip, location.X + 1); 
     pointx = location.X + 1; 
     pointy = location.Y + 1; 
     canvas.Children.Add(elip); 
    } 

    private void MouseMove_NotDown(object sender, MouseEventArgs e) 
    { 
     canvas.Cursor = Cursors.Hand; 
    } 

    private void canvas_PreviewMouseMove(object sender, MouseEventArgs e) 
    { 
     try 
     { 
      Point location = e.MouseDevice.GetPosition(canvas); 
      double height = location.Y - pointy; 
      double width = location.X - pointx; 
      if (height >= 0 && width >= 0) 
      { 
       elip.Height = height; 
       elip.Width = width; 
      } 
      else if (height < 0 || width < 0) 
      { 
       if (height < 0) 
       { 
        elip.Height = height + (-height) + 1; 
        elip.Width = width; 
       } 
       else if (width < 0) 
       { 
        elip.Height = height; 
        elip.Width = width + (-width) + 1; 
       } 
      } 
     } 
     catch 
     { 

     } 
    } 

    private void canvas_PreviewMouseUp(object sender, MouseButtonEventArgs e) 
    { 
     elip.Stroke = Brushes.Black; 
     elip.StrokeThickness = 2; 

     canvas.MouseMove -= canvas_PreviewMouseMove; 
     canvas.MouseMove += MouseMove_NotDown; 
     canvas.MouseUp += canvas_PreviewMouseUp; 
    } 
+3

これまでに何を試しましたか? – tabby

+2

これまでに試したことを投稿してください。いくつかのポインタは、あなたのキャンバスの背景を色に設定します(色が必要ない場合は透明です)。そうでない場合、マウスクリックイベントは発生しません。次に、MouseDownとMouseMoveイベントハンドラを使用します。 –

+0

ありがとうございます。私は自分のコードを更新しました。前もって感謝します。 –

答えて

1

です。これにより、アプリケーション・ロジックの理解とデバッグが容易になります。 WPFのcanvasは、背景が設定されていない場合はクリックされたキャンバスの中で何かがない限り

、それはそうはそれを背景色を与える、マウスイベントをキャッチしません

(白または透明で結構です) XAML:

<Window x:Class="mausing.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:mausing" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <Canvas x:Name="canvas" Background="White"></Canvas> 
</Grid> 

のC#:

public partial class MainWindow : Window 
{ 
    private Ellipse elip = new Ellipse(); 
    private Point anchorPoint; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     canvas.MouseMove += canvas_MouseMove; 
     canvas.MouseUp += canvas_MouseUp; 
     canvas.MouseDown += canvas_MouseDown; 
    } 

    private void canvas_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     //capture the mouse on the canvas 
     //(this also helps us keep track of whether or not we're drawing) 
     canvas.CaptureMouse(); 

     anchorPoint = e.MouseDevice.GetPosition(canvas); 
     elip = new Ellipse 
     { 
      Stroke = Brushes.Black, 
      StrokeThickness = 2 
     }; 
     canvas.Children.Add(elip); 
    } 

    private void canvas_MouseMove(object sender, MouseEventArgs e) 
    { 
     //if we are not drawing, we don't need to do anything when the mouse moves 
     if (!canvas.IsMouseCaptured) 
      return; 

     Point location = e.MouseDevice.GetPosition(canvas); 

     double minX = Math.Min(location.X, anchorPoint.X); 
     double minY = Math.Min(location.Y, anchorPoint.Y); 
     double maxX = Math.Max(location.X, anchorPoint.X); 
     double maxY = Math.Max(location.Y, anchorPoint.Y); 

     Canvas.SetTop(elip, minY); 
     Canvas.SetLeft(elip, minX); 

     double height = maxY - minY; 
     double width = maxX - minX; 

     elip.Height = Math.Abs(height); 
     elip.Width = Math.Abs(width);  
    } 

    private void canvas_MouseUp(object sender, MouseButtonEventArgs e) 
    { 
     // we are now no longer drawing 
     canvas.ReleaseMouseCapture(); 
    } 
} 
+0

@Clemensありがとう、私はちょうどそれを回避しようとしていた:p –

+2

'is_drawing'フラグを処理する代わりに、より良い[マウスをキャプチャ](https://msdn.microsoft.com/en-us/library/system) .windows.uielement.capturemouse(v = vs.110).aspx)、キャプチャされているかどうか確認してください(https://msdn.microsoft.com/en-us/library/system.windows.uielement.ismousecaptured(v = vs.110).aspx)。 [キャプチャを解除する](https://msdn.microsoft.com/en-us/library/system.windows.uielement.releasemousecapture(v = vs.110).aspx)をクリックします。 – Clemens

+0

@クレメンスありがとう。完全に合意した。 –

関連する問題