tutorial ejemplos desde cero aprender c# wpf wpf-controls

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