InkCanvas personalizzati (esempio di codice MSDN non funzionante correttamente)

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

  •  07-07-2019
  •  | 
  •  

Domanda

Voglio usare pennelli personalizzati con InkCanvas.

Loro è uno snippet di codice di MSDN. ( http://msdn.microsoft.com/en-us/library/ms747347 aspx )

Se uso quel codice e muovo il mouse MOLTO velocemente ottengo spazio tra i pennelli (ellissi): Schermata

E la mia domanda è ovviamente come risolvere questo problema, ma sono anche curioso di sapere perché ciò sta accadendo (voglio imparare da esso) Ho pensato che forse ho fatto qualcosa di sbagliato ma anche se ho tagliato / incollato l'esempio sta accadendo.

Una piccola cosa che ho notato durante la lettura del codice è stato questo commento nella classe CustomStroke

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

Mi sembra che dovrebbe disegnare delle ellissi tra i punti non solo nei punti.

Sto usando C # .NET.

Ancora in breve:

  • Perché sta succedendo
  • Aiutami a risolverlo :)
È stato utile?

Soluzione

Perché questo sta accadendo

I InkCanvas personalizzati nell'esempio disegnano un'ellisse ad ogni StrokePoint raccolto ma non tentano di tracciare linee tra di loro. Il controllo InkCanvas standard viene implementato disegnando linee tra i punti che viene assegnato. Questo è il motivo per cui l'implementazione InkCanvas personalizzata dell'esempio lascia vuoti e quella integrata no.

Come " correggere " it

Il codice personalizzato potrebbe essere facilmente esteso per non lasciare spazi vuoti: oltre a disegnare ellissi in ogni punto, potrebbe tracciare linee tra ogni coppia di punti.

Il codice per disegnare le linee di collegamento potrebbe essere aggiunto prima del codice per disegnare le ellissi, in questo modo:

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

Questo codice funziona costruendo una polilinea StreamGeometry e quindi disegnandola nel contesto. L'uso di StreamGeometry in questo contesto è generalmente più efficiente rispetto alla creazione di PathGeometry con una polilinea o all'esecuzione di un sacco di chiamate DrawLine direttamente su drawingCanvas.

Nota: l'uso di un miglior digitalizzatore non risolverà il problema sottostante, ovvero che InkCanvas personalizzato è effettivamente progettato per mostrare solo i dati nei punti campionati e non in mezzo.

Altri suggerimenti

Perché ciò sta accadendo: il controllo WPF InkCanvas ha un numero limitato di input al secondo quando si usa un mouse; ciò significa che i tuoi input dello stilo avranno distanze sempre maggiori tra loro mentre muovi il mouse sempre più velocemente. Il campione stesso sembra disegnare ellissi in ogni punto di input dello stilo, non tra i punti.

Come risolverlo: usa un Tablet PC - un digitalizzatore come su un Tablet PC ha un numero molto più alto di input al secondo, quindi è più difficile incontrare o riempire gli spazi vuoti - essenzialmente stimare sulla base di punti precedenti , forse una curva più bezier.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top