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