Benutzerdefinierte InkCanvas (MSDN Code-Beispiel nicht ordnungsgemäß funktioniert)

StackOverflow https://stackoverflow.com/questions/1422503

  •  07-07-2019
  •  | 
  •  

Frage

Ich mag benutzerdefinierte Pinsel mit dem InkCanvas verwenden.

Sie ist ein Code-Snippet von MSDN. ( http://msdn.microsoft.com/en-us/library/ms747347 aspx )

Wenn ich diesen Code verwenden, und meine Maus bewegt sich sehr schnell bekomme ich Raum zwischen den Bürsten (Ellipsen): Screenshot

Und meine Frage ist natürlich, wie diese zu beheben, aber ich bin auch neugierig, warum dies geschieht (ich will von ihm lernen) Ich dachte, vielleicht habe ich etwas falsch, aber selbst wenn ich Ausschneiden / Einfügen das Beispiel, dass es passiert.

Eine kleine Sache, die ich bemerkt, wenn das Lesen der Code dieser Kommentar in der CustomStroke Klasse war

// Draw linear gradient ellipses between
// all the StylusPoints in the Stroke

scheint mir, wie es Ellipsen zwischen den Punkten nicht nur an den Punkten ziehen sollte.

I C # .NET bin mit.

Auch hier kurz:

  • Warum ist das passiert
  • Hilfe me fix it :)
War es hilfreich?

Lösung

Warum dies geschieht

Die benutzerdefinierten InkCanvas im Beispiel zieht bei jeder gesammelt StrokePoint eine Ellipse, aber macht keinen Versuch, Linien zwischen ihnen zu ziehen. Die Standard InkCanvas Steuerung wird durch das Zeichnen von Linien zwischen den Punkten umgesetzt es gegeben ist. Aus diesem Grund ist der Brauch InkCanvas Implementierung aus dem Beispiel lässt Lücken und die eingebaute in einem nicht.

Wie zu "reparieren" es

Der benutzerdefinierte Code leicht erweitert werden kann, um keine Lücken zu lassen. Zusätzlich zu Ellipsen an jedem Punkt zeichnen, könnte es Linien zwischen jedem Paar von Punkten zeichnen

Code-Verbindungslinien ziehen könnten vor dem Code hinzugefügt werden, um die Ellipsen zu zeichnen, wie folgt aus:

// Draw connecting lines
var geo = new StreamGeometry();
using(geoContext = geo.Open())
{
  geoContext.StartFigure(stylusPoints[0], false, false);
  geoContext.PolyLineTo(stylusPoints.Skip(1).Cast<Point>(), true, false);
}
drawingContext.DrawGeometry(null, connectingLinePen, geo);

// Draw ellipses
for(int i = 1; i < stylusPoints.Count; i++)
{
  ... etc ...

Dieser Code funktioniert durch eine Polylinie StreamGeometry konstruieren und dann es auf den Kontext zu ziehen. eine StreamGeometry in diesem Zusammenhang verwendet, ist im Allgemeinen effizienter als eine PathGeometry mit einem Linienzug erstellen oder ein Bündel von DrawLine tun auf den drawingCanvas direkt aufruft.

. Hinweis: eine bessere Digitalisierer verwendet, wird das zugrunde liegende Problem nicht lösen, das ist, dass die benutzerdefinierte InkCanvas eigentlich nur zeigen Daten an den abgetasteten Punkten ausgebildet ist und nicht zwischen

Andere Tipps

Warum dies geschieht: Die WPF InkCanvas Kontrolle über eine begrenzte Anzahl von Eingängen pro Sekunde hat, wenn eine Maus verwendet wird; was bedeutet, dass Sie mit dem Stift Eingänge immer größere Entfernungen zwischen ihnen haben, wie Sie die Maus schneller und schneller bewegen. Die Probe selbst erscheint Ellipsen an jedem Stift Eingangspunkt, nicht zwischen den Punkten zu zeichnen.

Wie dieses Problem zu lösen: einen Tablet PC verwenden - ein Digitalisierer wie auf einem Tablet PC eine viel höhere Anzahl von Eingängen pro Sekunde hat, so dass es schwieriger zu begegnen ist, oder in den Lücken füllen - im Wesentlichen auf früheren Punkten Schätzung auf Basis , vielleicht eine Bezier-Kurve.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top