2009-09-14 15 views
1

Je souhaite utiliser des styles personnalisés avec InkCanvas.InkCanvas personnalisé (l'exemple de code MSDN ne fonctionne pas correctement)

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

Si j'utilise ce code et déplace ma souris très vite je reçois l'espace entre les brosses (ellipses): Screenshot http://i27.tinypic.com/zsrdwi.jpg

Et ma question est bien sûr comment résoudre ce problème, mais je suis aussi curieux pourquoi cela se produit (je veux en tirer des leçons) J'ai pensé que peut-être j'ai fait quelque chose de mal mais même si je coupe/colle l'exemple, ça se passe.

Une petite chose que j'ai remarqué lors de la lecture du code était ce commentaire dans la classe CustomStroke

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

Il me semble que cela devrait dessiner des ellipses entre les points non seulement aux points.

J'utilise C# .NET.

Encore une fois en bref:

  • Pourquoi cela se produit
  • Aidez-moi à le corriger :)

Répondre

1

Pourquoi cela se produit

InkCanvas personnalisés dans l'exemple dessine une ellipse à chaque StrokePoint recueillie, mais ne cherche pas à tracer des lignes entre elles. Le contrôle InkCanvas standard est implémenté en dessinant des lignes entre les points qui lui sont donnés. C'est pourquoi l'implémentation personnalisée d'InkCanvas à partir de l'exemple laisse des espaces vides et l'implémentation intégrée ne le fait pas.

Comment « fixer » il

Le code personnalisé peut facilement être étendue à ne pas laisser des espaces: En plus de dessiner des ellipses à chaque point, il pourrait tracer des lignes entre chaque paire de points.

code pour tracer 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 un StreamGeometry polyligne puis dessin au contexte. Utiliser un StreamGeometry dans ce contexte est généralement plus efficace que de créer un PathGeometry avec un Polyline ou de faire un tas d'appels DrawLine directement sur le drawingCanvas.Remarque: L'utilisation d'un numériseur de meilleure qualité ne résoudra pas le problème sous-jacent, à savoir que le InkCanvas personnalisé est conçu pour afficher uniquement les données aux points échantillonnés et non entre les deux.

+0

Merci, ça marche maintenant. Je devais juste ajouter une ligne pour relier les points ensemble. –

0

Pourquoi cela se passe: Le contrôle WPF InkCanvas a un nombre limité d'entrées par seconde lorsque vous utilisez une souris Cela signifie que vos entrées de stylet auront des distances de plus en plus grandes entre elles lorsque vous déplacez la souris de plus en plus vite. L'échantillon lui-même semble dessiner des ellipses à chaque point d'entrée de stylet, pas entre les points. Comment résoudre ceci: utiliser un Tablet PC - un numériseur comme sur un Tablet PC a un nombre beaucoup plus élevé d'entrées par seconde, il est donc plus difficile à rencontrer, ou remplir les blancs - essentiellement estimer en fonction de la précédente points, peut-être une courbe bezier.

+0

Ok, mais pourquoi est-ce que se passe quand je suis sur un InkCanvas personnalisé? Le InkCanvas normal fonctionne comme prévu –