nAbend,
bin neu in C# und WPF und würde gerne eine kleine Zeichenanwendung programmieren. Meine erster Ansatz ist zwar schon brauchbar, aber die gezeichneten Striche sind "verwackelt", kantig und manchmal kommt es zu "Aussetzern" und der Strich wird unterbrochen:
Im Wesentlichen setze ich die Variable "draw" auf true, sobald die Maus gedrückt wird. Bei einem MouseMove-Event wird dann ein Polyline-Objekt mit der aktuellen Mausposition gefüttert, sofern die Variable noch true ist. Bei MouseUp wird "draw" wieder auf false gesetzt.
Meine Frage ist, warum die Striche so verwackelt sind oder ob ich meinen Code überhaupt zur Gänze umschreiben sollte? Ich konnte nämlich nichts zu MouseDrag finden, bzw bin ich mir nicht sicher ob das Polyline-Objekt die richtige Wahl ist, oder ob es hier bessere Alternativen gibt?
Hier mein Code:
WPF
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| <Window x:Class="SketchRecognition.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="SketchRecognition" Height="350" Width="525"> <Grid> <Canvas Name="paintCanvas" Background="LemonChiffon" MouseMove="paintCanvas_MouseMoveHandler" MouseLeftButtonDown="paintCanvas_MouseLeftButtonDown" MouseLeftButtonUp="paintCanvas_MouseLeftButtonUp"> </Canvas> </Grid> </Window> |
C#-MainWindow.cs
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| namespace SketchRecognition { public partial class MainWindow : Window { private bool draw; private List<SketchObject> sketchedObjects;
public MainWindow() { InitializeComponent();
draw = false;
sketchedObjects = new List<SketchObject>(); }
private void paintCanvas_MouseMoveHandler(object sender, MouseEventArgs e) { if (draw) { sketchedObjects[sketchedObjects.Count-1].addPoint(e.GetPosition(this)); } }
private void paintCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { draw = true;
SketchObject sketch = new SketchObject(paintCanvas); sketchedObjects.Add(sketch); }
private void paintCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { draw = false; }
} } |
C#-SketchObject.cs
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| namespace SketchRecognition { class SketchObject { private PointCollection pointList; private Polyline polyline; private Canvas paintCanvas;
public SketchObject(Canvas paintCanvas) { this.paintCanvas = paintCanvas;
pointList = new PointCollection();
polyline = new Polyline(); polyline.Points = pointList; polyline.Stroke = System.Windows.Media.Brushes.SlateGray; polyline.StrokeThickness = 2; polyline.FillRule = FillRule.EvenOdd;
paintCanvas.Children.Add(polyline); }
public void addPoint(Point mousePosition) { pointList.Add(mousePosition); } } } |
Moderiert von
Christian S.: C#- durch XML-Tags ersetzt