Salut à tous,

Sauriez-vous comment je pourrais permettre à l'utilisateur de créer une ligne un peu comme avec le crayon à la Paint ?

En gros j'ai pensé à un évènement MouseDown appliqué à un canvas qui placerait un rectangle aux coordonnées du click :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
private void dessin_MouseDown(object sender, MouseButtonEventArgs e)
        {
            // Get the position of the element relative to the Canvas.
            Point point = e.GetPosition(this.dessin);
 
            if (e.ButtonState == Mouse.LeftButton)
            {
                Rectangle rec=new Rectangle();
                rec.Height=4;
                rec.Width=4;
                rec.Fill=Brushes.Black;
                dessin.Children.Add(rec);
                rec.SetCurrentValue(Canvas.TopProperty, point.Y);
                rec.SetCurrentValue(Canvas.LeftProperty, point.X);
 
            }
        }
mais ça ne marche pas le rectangle se retrouve en haut à gauche du canvas quand je relache la souris au-dessus de lui et il reste à sa place si je relache la souris à côté mais il n'y a pas d'autres rectangles créés à côté pour faire une ligne,

Auriez-vous une idée comment faire cela ?

Merci d'avance

EDIT :

en fait j'ai réussi à peu près à faire le truc avec un evt MouseMove mais j'ai toujours un pb : lorsque l'utilisateur bouge rapidement la souris la ligne est discontinue, peut -on corriger ça ?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
void dessin_MouseMove(object sender, MouseEventArgs e)
        {
            UIElement element = e.OriginalSource as UIElement;
            if (element == null) return;
 
            // Get the position of the element relative to the Canvas.
            Point point = e.GetPosition(this.dessin);
 
            if (e.LeftButton==MouseButtonState.Pressed)
            {
                Ellipse rec = new Ellipse();
                rec.Height = 4;
                rec.Width = 4;
                rec.Fill = Brushes.Black;
                dessin.Children.Add(rec);
                rec.SetCurrentValue(Canvas.TopProperty, point.Y);
                rec.SetCurrentValue(Canvas.LeftProperty, point.X);
 
            }
        }
EDIT : bon j'ai trouvé la solution :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
private void dessin_MouseDown(object sender, MouseButtonEventArgs e)
        {
            // Get the position of the element relative to the Canvas.
            debut = e.GetPosition(this.dessin);
        }
 
 
        void dessin_MouseMove(object sender, MouseEventArgs e)
        {
            UIElement element = e.OriginalSource as UIElement;
            if (element == null) return;
 
            // Get the position of the element relative to the Canvas.
            Point point = e.GetPosition(this.dessin);
 
            if (e.LeftButton==MouseButtonState.Pressed)
            {
                Line ligne = new Line();
                ligne.Stroke = Brushes.Black;
                ligne.StrokeThickness = 4;
                dessin.Children.Add(ligne);
                ligne.X1 = debut.X;
                ligne.Y1 = debut.Y;
                ligne.X2 = point.X;
                ligne.Y2 = point.Y;
                debut = point;
            }
        }