2013-04-16 67 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

我敢打赌,你的画布不接收鼠标事件,因为它的背景属性设置为透明

这对我工作得很好。

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的引用,而不是将coords与其相关联。 – 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

当使用线,粗线(line.StrokeThickness = 20)看起来是这样的:

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>