Pregunta

Quiero usar pinceles personalizados con InkCanvas.

Su es un fragmento de código de MSDN. ( http://msdn.microsoft.com/en-us/library/ms747347 .aspx )

Si uso ese código y muevo el mouse MUY rápido, obtengo espacio entre los pinceles (elipses): Captura de pantalla

Y mi pregunta es, por supuesto, cómo solucionar esto, pero también tengo curiosidad de por qué sucede esto (quiero aprender de ello). Pensé que tal vez hice algo mal, pero incluso si corté / pegué el ejemplo, está sucediendo.

Una pequeña cosa que noté al leer el código fue este comentario en la clase CustomStroke

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

Me parece que debería dibujar elipses entre los puntos, no solo en los puntos.

Estoy usando C # .NET.

Nuevamente en resumen:

  • ¿Por qué sucede esto?
  • Ayúdame a solucionarlo :)
¿Fue útil?

Solución

Por qué sucede esto

El InkCanvas personalizado en el ejemplo dibuja una elipse en cada StrokePoint recopilado, pero no intenta dibujar líneas entre ellos. El control estándar de InkCanvas se implementa dibujando líneas entre los puntos que se le dan. Es por eso que la implementación personalizada de InkCanvas del ejemplo deja vacíos y la integrada no.

Cómo " arreglar "

El código personalizado podría extenderse fácilmente para no dejar espacios: además de dibujar elipses en cada punto, podría dibujar líneas entre cada par de puntos.

El código para dibujar líneas de conexión podría agregarse antes del código para dibujar las elipses, así:

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

Este código funciona construyendo una StreamGeometry de polilínea y luego dibujándola al contexto. Usar un StreamGeometry en este contexto es generalmente más eficiente que crear un PathGeometry con una Polilínea o hacer un montón de llamadas DrawLine directamente en el dibujo de Lienzo.

Nota: El uso de un mejor digitalizador no resolverá el problema subyacente, que es que el InkCanvas personalizado está diseñado para mostrar solo datos en los puntos muestreados y no en el medio.

Otros consejos

Por qué sucede esto: el control WPF InkCanvas tiene un número limitado de entradas por segundo cuando se usa un mouse; lo que significa que las entradas de su lápiz tendrán distancias cada vez mayores entre ellas a medida que mueve el mouse cada vez más rápido. La muestra misma parece dibujar elipses en cada punto de entrada del lápiz, no entre los puntos.

Cómo resolver esto: use una Tablet PC: un digitalizador como en una Tablet PC tiene una cantidad mucho mayor de entradas por segundo, por lo que es más difícil de encontrar o completar los espacios en blanco, esencialmente una estimación basada en puntos anteriores , tal vez una curva bezier.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top