InkCanvas Personalizado (Código de exemplo MSDN não está funcionando corretamente)

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

  •  07-07-2019
  •  | 
  •  

Pergunta

Eu quero usar pincéis personalizados com as InkCanvas.

A sua é um trecho de código da MSDN. ( http://msdn.microsoft.com/en-us/library/ms747347 aspx )

Se eu usar esse código e mova o mouse muito rápido eu recebo espaço entre as escovas (elipses): Captura de tela

E a minha pergunta é, naturalmente, como corrigir isso, mas eu também estou curioso porque isso está acontecendo (Eu quero aprender com ele) eu pensei que talvez eu fiz algo errado, mas mesmo se eu cortar / colar o exemplo que está acontecendo.

Uma pequena coisa que eu notei quando a leitura do código foi este comentário na classe CustomStroke

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

Parece-me que ele deve desenhar elipses entre os pontos não só nos pontos.

Eu estou usando C # .NET.

Novamente em suma:

  • Por que isso está acontecendo
  • Ajuda-me a corrigir :)
Foi útil?

Solução

Por que isso está acontecendo

Os InkCanvas personalizados no exemplo desenha uma elipse em cada StrokePoint recolhido, mas não faz nenhuma tentativa para desenhar linhas entre eles. O controle InkCanvas padrão é implementado pelo desenho de linhas entre os pontos é dado. É por isso que o InkCanvas personalizados implementação das lacunas exemplo folhas e as built-in um não.

Como "solução" it

O código personalizado poderia facilmente ser estendido para não deixar lacunas:. Além de desenhar elipses em cada ponto, ele poderia desenhar linhas entre cada par de pontos

código para desenhar linhas de conexão pode ser adicionado antes do código para desenhar as elipses, como este:

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

Esse código funciona através da construção de um StreamGeometry polilinha e, em seguida, puxando-o para o contexto. Usando um StreamGeometry neste contexto é geralmente mais eficiente do que a criação de um PathGeometry com uma Polyline ou fazer um monte de DrawLine chamadas diretamente sobre as DrawingCanvas.

Nota:. Usando um digitalizador melhor não vai resolver o problema subjacente, que é que o InkCanvas personalizados é realmente concebido para mostrar apenas os dados nos pontos amostrados e não no meio

Outras dicas

Por que isso está acontecendo: O controle WPF InkCanvas tem um número limitado de entradas por segundo quando utiliza um rato; o que significa que suas entradas de caneta terá cada vez maiores distâncias entre eles como você move o mouse mais rápido e mais rápido. A amostra em si parece desenhar elipses em cada ponto de entrada de caneta, não em-entre os pontos.

Como resolver esse: usar um Tablet PC - um digitalizador, como em um Tablet PC tem um muito maior número de entradas por segundo por isso é mais difícil de encontro, ou preencher os espaços em branco - essencialmente estimamos com base nos pontos anteriores , talvez uma curva de bezier.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top