web-dev-qa-db-fra.com

WPF - Dessin sur toile avec des événements de souris

J'ai un problème avec la gestion des événements de souris sur le canevas. Je veux dessiner dessus en utilisant la souris et j'ai trouvé 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 qu'il commence à fonctionner?

19
Dawid B

Je suis prêt à parier que votre toile ne reçoit pas d'événements de souris car sa propriété d'arrière-plan est définie sur transparent

Cela fonctionne bien pour moi.

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

    }
}
52
Andy

Utilisation simple de 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>
3
Andreas

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

enter image description here

J'ai donc essayé PolyLine et fonctionne très 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);
   }
};
2
Sangwon Choi
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);
    }
}
0
Grenkin