O modelo de encadeamento de tinta
Um dos benefícios da tinta em um Tablet PC é que ele parece muito com escrever com uma caneta comum e papel. Para fazer isso, a caneta eletrônica coleta dados de entrada em uma taxa muito maior do que um mouse e renderiza a tinta assim que o usuário escreve. O encadeamento da interface do usuário (UI) do aplicativo não é suficiente para coletar dados da caneta e renderizar a tinta, porque ele pode se tornar bloqueado. Para resolver isso, um aplicativo WPF usa dois encadeamentos adicionais quando um usuário escreve a tinta.
A lista a seguir descreve os encadeamentos que fazem a parte de coletar e renderizar tinta digital:
Encadeamento de caneta - o encadeamento que leva os dados provenientes de caneta. (Na realidade, este é um pool de encadeamentos, mas este tópico refere-se a ele como um encadeamento da caneta.)
Encadeamento de interface do usuário do aplicativo - o encadeamento que controla o interface do usuário do aplicativo.
Encadeamento de renderização dinâmica - o encadeamento que renderiza a tinta enquanto o usuário desenha um traço. O encadeamento de renderização dinâmica é diferente do que o encadeamento que renderiza outros elementos interface do usuário para o aplicativo, como mencionado no Windows Presentation Foundation Modelo de Threading.
O modelo de tinta é o mesmo se o aplicativo usa o InkCanvas ou um controle personalizado semelhante ao mesmo em Criar um controle de entrada à tinta. Embora este tópico discuta encadeamento em termos de InkCanvas, os mesmos conceitos se aplicam quando você cria um controle personalizado.
Visão geral de Encadeamento
O diagrama a seguir ilustra o modelo de encadeamento quando um usuário desenha uma pincelada:
Ações que ocorrem enquanto o usuário desenha o traço
Quando o usuário desenha um traço, os pontos de Stylus vêm no encadeamento de caneta. Plug-ins de caneta , incluindo o DynamicRenderer, aceita os pontos da caneta no encadeamento de caneta e tem a chance para modificá-las antes do InkCanvas recebê-los.
O DynamicRenderer renderiza os pontos caneta no encadeamento de processamento dinâmico. Isso acontece ao mesmo tempo que a etapa anterior.
O InkCanvas recebe os pontos de caneta no encadeamento interface do usuário.
Ações que ocorrem após o usuário terminar o traço
Quando o usuário termina de desenhar o traço, o InkCanvas cria um objeto Stroke e adiciona-o ao InkPresenter, que estaticamente renderiza-o.
O encadeamento de interface do usuário alerta o DynamicRenderer que o traço é estaticamente renderizado, portanto, o DynamicRenderer remove sua representação visual do traço.
Plug-ins de Stylus e coleção de tinta
Cada UIElement tem um StylusPlugInCollection. Os objetos StylusPlugIn no StylusPlugInCollection recebem e podem modificar os pontos de caneta no encadeamento de caneta. Os objetos StylusPlugIn recebem os pontos de Stylus de acordo com a sua ordem na StylusPlugInCollection.
O diagrama a seguir ilustra a situação hipotética onde a coleção StylusPlugIns de um UIElement contém um stylusPlugin1, e um DynamicRenderer e stylusPlugin2, nessa ordem.
No diagrama anterior, o seguinte comportamento ocorre:
StylusPlugin1 modifica os valores de x e y.
DynamicRenderer recebe os pontos de Stylus modificados e renderiza-os no encadeamento de renderização dinâmica.
StylusPlugin2 recebe os pontos de Stylus modificados e então modifica os valores de x e y.
O aplicativo obtém os pontos de Stylus e, quando o usuário termina o traço, renderiza estaticamente o traço.
Suponha que stylusPlugin1 restringe os pontos de Stylus a um retângulo e stylusPlugin2 translada os pontos de Stylus para a direita. No cenário anterior, o DynamicRenderer recebe os pontos de Stylus restritos, mas não os pontos de Stylus transladados. Quando o usuário desenha o traço, o traço é renderizado dentro dos limites do retângulo, mas o traço não parece ser transladado até que o usuário levante a caneta.
Executando operações com um plug-in de Stylus no encadeamento de interface do usuário
Como testes de colisão precisos não podem ser realizados no encadeamento de caneta, alguns elementos podem ocasionalmente receber entrada de Stylus destinados a outros elementos. Se você precisar certificar-se de que a entrada foi roteada corretamente antes de executar uma operação, inscreva-se e execute a operação no OnStylusDownProcessed, OnStylusMoveProcessed, ou o método OnStylusUpProcessed. Esses métodos são chamados pelo encadeamento de aplicativo depois testes de colisão precisos foram executados. Para inscrever-se nesses métodos, chame o método NotifyWhenProcessed no método que ocorre no encadeamento de caneta.
O diagrama a seguir ilustra o relacionamento entre o encadeamento de caneta e o encadeamento de interface do usuário com relação aos eventos caneta de um StylusPlugIn.
Renderização de Tinta
Assim que o usuário desenha um traço, DynamicRenderer renderiza a tinta em um encadeamento separado para que a tinta pareca "fluir" a partir da caneta, mesmo quando o encadeamento interface do usuário está ocupado. O DynamicRenderer cria uma árvore visual no encadeamento de renderização dinâmico assim que ele coleta pontos de Stylus. Quando o usuário termina de traço, o DynamicRenderer pede para ser notificado quando o aplicativo faz o próximo passo de renderização. Após o aplicativo concluir o próximo passo de renderização, o DynamicRenderer limpa sua árvore visual. O seguinte diagrama ilustra esse processo:
O usuário inicia o traço.
- O DynamicRenderer cria a árvore visual.
O usuário está desenhando o traço.
- O DynamicRenderer cria a árvore visual.
O usuário termina de traço.
O InkPresenter adiciona o traço à sua árvore visual.
A camada Integração de mídia (MIL) renderiza estaticamente os traços.
O DynamicRenderer limpa os elementos visuais.