WPF – Dessin sur canvas avec événements de souris

J’ai un problème avec la gestion des événements de souris sur la canvas. Je veux dessiner dessus à l’aide de la souris et j’ai créé ces gestionnaires d’événements, mais ils ne font rien quand je commence à dessiner.

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); } } 

Pouvez-vous m’aider en disant ce qui manque ou comment le réécrire pour que ça commence à fonctionner?

Je suis prêt à parier que votre canvas ne reçoit pas d’événements de souris, car sa propriété background est définie sur transparent

Cela fonctionne bien pour moi.

entrez la description de l'image ici

        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); } } } } 

Lorsque vous utilisez Ligne, une ligne épaisse (line.StrokeThickness = 20) ressemble à ceci:

entrez la description de l'image ici

J’ai donc essayé PolyLine et tout fonctionne bien (à partir de cet exemple, 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); } }; 

Utilisation simple du InkCanvas

       
 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); } }