c# - ejemplos - WPF-Dibujo sobre lienzo con eventos de ratón.
wpf xaml (4)
Tengo un problema con el manejo de eventos del mouse en el lienzo. Quiero dibujar usando el mouse y he creado estos controladores de eventos, pero no hacen nada cuando comienzo a dibujar.
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);
}
}
¿Puedes ayudarme contando lo que falta o cómo reescribirlo para que comience a funcionar?
Cuando se usa Line, la línea gruesa (line.StrokeThickness = 20) se ve así:
Así que probé PolyLine y funciona bien (de este ejemplo, 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);
}
};
Estoy dispuesto a apostar a que su lienzo no está recibiendo eventos del mouse porque su propiedad de fondo está configurada como transparente
Esto funciona bien para mi.
<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);
}
}
}
}
Simple uso de las 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>
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);
}
}