Compartilhar via


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:

Modelo de threading ao desenhar um traço.

  1. Ações que ocorrem enquanto o usuário desenha o traço

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

    2. O DynamicRenderer renderiza os pontos caneta no encadeamento de processamento dinâmico. Isso acontece ao mesmo tempo que a etapa anterior.

    3. O InkCanvas recebe os pontos de caneta no encadeamento interface do usuário.

  2. Ações que ocorrem após o usuário terminar o traço

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

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

Ordem de plug-ins de caneta eletrônica que influenciam na saída.

No diagrama anterior, o seguinte comportamento ocorre:

  1. StylusPlugin1 modifica os valores de x e y.

  2. DynamicRenderer recebe os pontos de Stylus modificados e renderiza-os no encadeamento de renderização dinâmica.

  3. StylusPlugin2 recebe os pontos de Stylus modificados e então modifica os valores de x e y.

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

Modelos de threading manuscrito (interface do usuário e caneta)

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:

Diagrama de threading de entrada manuscrita

  1. O usuário inicia o traço.

    1. O DynamicRenderer cria a árvore visual.
  2. O usuário está desenhando o traço.

    1. O DynamicRenderer cria a árvore visual.
  3. O usuário termina de traço.

    1. O InkPresenter adiciona o traço à sua árvore visual.

    2. A camada Integração de mídia (MIL) renderiza estaticamente os traços.

    3. O DynamicRenderer limpa os elementos visuais.