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?
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.
<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);
}
}
}
}
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>
Lorsque vous utilisez Line, une ligne épaisse (line.StrokeThickness = 20) ressemble à ceci:
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);
}
};
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);
}
}