2013-04-16 20 views
18

Ich habe ein Problem mit der Behandlung von Mausereignissen auf Leinwand. Ich möchte mit der Maus darauf zeichnen, und ich habe diese Event-Handler entwickelt, aber sie tun nichts, wenn ich anfange zu zeichnen.WPF - Zeichnen auf Leinwand mit Mausereignissen

Können Sie mir helfen, indem Sie mir sagen, was fehlt oder wie es neu geschrieben wird, damit es funktioniert?

Antwort

45

Ich bin bereit zu wetten, dass Ihre Leinwand nicht Mausereignisse empfängt, weil es Hintergrund-Eigenschaft ist auf transparent ist

Dies funktioniert gut für mich.

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

    } 
} 
+3

Yep. Genau das habe ich getan. Vielen Dank. –

+0

Wie kann ich die Klick-Erfassung aktualisieren, um Offsets aufgrund von Menüs zu berücksichtigen? – Benjin

+8

Anstatt einen Verweis auf das Fenster in GetPosition zu übergeben, übergeben Sie stattdessen einen Verweis auf Canvas, sodass die Koordinaten stattdessen relativ zu diesem sind. – Andy

0
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); 
    } 
} 
+1

Das funktioniert, aber die Form wird angezeigt ** nach ** _Mouse_up_ –

1

Wenn Linie mit, dicke Linie (line.StrokeThickness = 20) sieht wie folgt aus:

enter image description here

Also habe ich versucht PolyLine und funktioniert gut (. von diesem Beispiel 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); 
    } 
}; 
1

Einfache Verwendung der 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> 
Verwandte Themen