Question

Je souhaite utiliser des pinceaux personnalisés avec le InkCanvas.

Leur est un extrait de code de MSDN. ( http://msdn.microsoft.com/en-us/library/ms747347 .aspx )

Si j'utilise ce code et déplace ma souris TRES rapidement, j'obtiens un espace entre les pinceaux (ellipses): Capture d'écran

Et ma question est bien sûr de savoir comment résoudre ce problème, mais je suis également curieuse de savoir pourquoi cela se produit (je veux en tirer des enseignements). Je pensais que j'avais peut-être commis une erreur, mais même si je coupais / collais l'exemple en cours.

Une petite chose que j'ai remarquée en lisant le code était ce commentaire dans la classe CustomStroke

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

Il me semble que les ellipses entre les points devraient être dessinés non seulement aux points.

J'utilise C # .NET.

Encore une fois en bref:

  • Pourquoi cela se produit-il
  • Aidez-moi à résoudre ce problème :)
Était-ce utile?

La solution

Pourquoi cela se produit-il

L'InkCanvas personnalisé de l'exemple dessine une ellipse à chaque StrokePoint collecté, mais ne tente pas de tracer de lignes entre eux. Le contrôle InkCanvas standard est mis en œuvre en traçant des lignes entre les points qui lui sont attribués. C’est la raison pour laquelle l’implémentation InkCanvas personnalisée de l’exemple laisse des espaces vides, contrairement à celle intégrée.

Comment "corriger" il

Le code personnalisé pourrait facilement être étendu pour ne pas laisser d'espaces vides: en plus de dessiner des ellipses à chaque point, il pourrait également tracer des lignes entre chaque paire de points.

Le code pour dessiner des lignes de connexion peut être ajouté avant le code pour dessiner les ellipses, comme ceci:

// 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 ...

Ce code fonctionne en construisant une polyligne StreamGeometry puis en la dessinant dans le contexte. Utiliser un StreamGeometry dans ce contexte est généralement plus efficace que de créer un PathGeometry avec une polyligne ou d’effectuer un ensemble d’appels DrawLine directement sur le DrawingCanvas.

Remarque: l'utilisation d'un meilleur numériseur ne résoudra pas le problème sous-jacent, à savoir que l'InkCanvas personnalisé est en réalité conçu pour afficher uniquement les données aux points échantillonnés et non entre les deux.

Autres conseils

Pourquoi ceci se produit: le contrôle WPF InkCanvas a un nombre limité d'entrées par seconde lorsqu'il utilise une souris; ce qui signifie que les entrées de votre stylet auront des distances de plus en plus grandes à mesure que vous déplacerez la souris de plus en plus vite. L’échantillon lui-même semble dessiner des elipses à chaque point d’entrée du stylet et non entre les points.

Comment résoudre ce problème: utilisez un Tablet PC - un numériseur, comme sur un Tablet PC, contient un nombre beaucoup plus important d'entrées par seconde, il est donc plus difficile de le trouver ou de remplir les blancs - une estimation essentiellement basée sur les points précédents , peut-être une courbe de Bézier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top