2013-04-16 47 views
18

キャンバス上でマウスイベントを処理する際に問題があります。私はマウスを使って描画したいので、これらのイベントハンドラを思いついたのですが、描画を開始するときに何もしません。WPF - マウスイベントでキャンバスに描画する

private void paintSurface_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     if (e.ButtonState == MouseButtonState.Pressed) 
      currentPoint = e.GetPosition(this); 
    } 

    private void paintSurface_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.LeftButton == MouseButtonState.Pressed) 
     { 
      Line line = new Line(); 

      line.Stroke = SystemColors.WindowFrameBrush; 
      line.X1 = currentPoint.X; 
      line.Y1 = currentPoint.Y; 
      line.X2 = e.GetPosition(this).X; 
      line.Y2 = e.GetPosition(this).Y; 

      currentPoint = e.GetPosition(this); 

      paintSurface.Children.Add(line); 
     } 
    } 

何が欠けているか、書き直す方法を教えてもらえますか?

答えて

45

backgroundプロパティは、透明な

に設定されている、それはこれが私のためうまく動作しているため、私はあなたのキャンバスにマウスイベントを受信して​​いないことを賭けて喜びました。ライン、太線(line.StrokeThickness = 20)を使用して

enter image description here

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Canvas Name="paintSurface" MouseDown="Canvas_MouseDown_1" MouseMove="Canvas_MouseMove_1" > 
     <Canvas.Background> 
      <SolidColorBrush Color="White" Opacity="0"/> 
     </Canvas.Background> 
    </Canvas> 
</Window> 


using System; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Input; 
using System.Windows.Shapes; 

namespace WpfApplication1 
{ 
    public partial class MainWindow : Window 
    { 

     Point currentPoint = new Point(); 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Canvas_MouseDown_1(object sender, System.Windows.Input.MouseButtonEventArgs e) 
     { 
      if (e.ButtonState == MouseButtonState.Pressed) 
       currentPoint = e.GetPosition(this); 
     } 

     private void Canvas_MouseMove_1(object sender, System.Windows.Input.MouseEventArgs e) 
     { 
      if (e.LeftButton == MouseButtonState.Pressed) 
      { 
       Line line = new Line(); 

       line.Stroke = SystemColors.WindowFrameBrush; 
       line.X1 = currentPoint.X; 
       line.Y1 = currentPoint.Y; 
       line.X2 = e.GetPosition(this).X; 
       line.Y2 = e.GetPosition(this).Y; 

       currentPoint = e.GetPosition(this); 

       paintSurface.Children.Add(line); 
      } 
     } 

    } 
} 
+3

うん。それはまさに私がやったことです。ありがとうございました。 –

+0

メニューによるオフセットを考慮してクリックキャプチャを更新するにはどうすればよいですか? – Benjin

+8

は、GetPositionのウィンドウへの参照を渡すのではなく、代わりにCanvasへの参照を渡します。アンディのコメント+1 – Andy

0
public partial class MainWindow : Window 
    { 
     Line newLine; 
     Point start; 
     Point end; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void DrawCanvas_MouseDown_1(object sender, MouseButtonEventArgs e) 
    { 
     start = e.GetPosition(this); 
    } 

    private void DrawCanvas_MouseMove_1(object sender, MouseEventArgs e) 
    { 
     if (e.LeftButton == MouseButtonState.Pressed) 
     { 
      end = e.GetPosition(this); 
     } 
    } 

    private void DrawCanvas_MouseUp_1(object sender, MouseButtonEventArgs e) 
    { 

     newLine = new Line(); 
     newLine.Stroke = SystemColors.WindowFrameBrush; 
     newLine.X1 = start.X; 
     newLine.Y1 = start.Y; 
     newLine.X2 = end.X; 
     newLine.Y2 = end.Y; 

     DrawCanvas.Children.Add(newLine); 
    } 
} 
+1

これは動作しますが、形状は** _Mouse_up_の後に表示されます –

1

次のようになります。

enter image description here

だから私はポリラインを試してみましたが、正常に動作します(この例からhttp://www.c-sharpcorner.com/uploadfile/mahesh/polyline-in-wpf/

Canvas.MouseMove += (sender, args) => 
{ 
    if (args.LeftButton == MouseButtonState.Pressed) 
    { 
     Polyline polyLine; 
     if (PathModeCanvas.Children.Count == 0) 
     { 
      polyLine = new Polyline(); 
      polyLine.Stroke = new SolidColorBrush(Colors.AliceBlue); 
      polyLine.StrokeThickness = 10; 

      Canvas.Children.Add(polyLine); 
     } 

     polyLine = (Polyline)Canvas.Children[0]; 
     Point currentPoint = args.GetPosition(Canvas); 
     polyLine.Points.Add(currentPoint); 
    } 
}; 
1

シンプルな使用InkCanvas

<InkCanvas x:Name="InkCanvas" x:FieldModifier="public" Background="Transparent" Opacity="1" EditingMode="GestureOnly" ForceCursor="True" Cursor="Pen" > 
          <InkCanvas.DefaultDrawingAttributes> 
           <DrawingAttributes Color="White" Width="7" Height="7" /> 
          </InkCanvas.DefaultDrawingAttributes> 
         </InkCanvas> 
関連する問題