Condividi tramite


Modello di threading dell'inchiostro

Uno dei vantaggi dell'inchiostro su un Tablet PC è che è molto simile a scrivere con penna e carta normali. A tal fine, la penna del tablet raccoglie dati a una velocità molto superiore rispetto a quella di un mouse e applica l'inchiostro mentre l'utente scrive. Il thread dell'interfaccia utente dell'applicazione non è sufficiente per raccogliere i dati della penna e il rendering dell'inchiostro, perché può diventare bloccato. Per risolvere questo, un'applicazione WPF utilizza due thread aggiuntivi quando un utente scrive con l'inchiostro digitale.

L'elenco seguente descrive i thread che partecipano alla raccolta e al rendering dell'inchiostro digitale.

  • Thread della penna: il filo che riceve l'input dalla penna. In realtà, si tratta di un pool di thread, ma questo argomento si riferisce a esso come thread penna.

  • Il thread dell'interfaccia utente dell'applicazione - il thread che controlla l'interfaccia utente dell'applicazione.

  • Thread di rendering dinamico: thread che esegue il rendering dell'input penna mentre l'utente traccia un tratto. Il thread di rendering dinamico è diverso dal thread che esegue il rendering di altri elementi dell'interfaccia utente per l'applicazione, come indicato in Window Presentation Foundation Modello di threading.

Il modello di inchiostrazione è lo stesso se l'applicazione utilizza il InkCanvas o un controllo personalizzato simile a quello in Creazione di un controllo input penna. Anche se questo argomento illustra il threading in termini di InkCanvas, gli stessi concetti si applicano quando si crea un controllo personalizzato.

Panoramica del threading

Il diagramma seguente illustra il modello di threading quando un utente disegna un tratto:

modello di threading durante il disegno di un tratto.

  1. Azioni che si verificano mentre l'utente traccia il segno

    1. Quando l'utente disegna un tratto, i punti dello stilo arrivano sul filo della penna. I plug-in dello stilo, incluso il DynamicRenderer, accettano i punti dello stilo sulla filettatura della penna e possono modificarli prima che il InkCanvas li riceva.

    2. Il DynamicRenderer esegue il rendering dei punti dello stilo nel thread di rendering dinamico. Ciò si verifica contemporaneamente al passaggio precedente.

    3. Il InkCanvas riceve i punti dello stilo nel thread dell'interfaccia utente.

  2. Azioni che si verificano dopo che l'utente termina il tratto

    1. Al termine del disegno del tratto, il InkCanvas crea un oggetto Stroke e lo aggiunge all'InkPresenter, che ne esegue il rendering statico.

    2. Il thread dell'interfaccia utente avvisa il DynamicRenderer che il tratto è stato reso statico, quindi il DynamicRenderer rimuove la rappresentazione visiva del tratto.

Collezione di inchiostro e Plug-in Stilo

Ogni UIElement ha un StylusPlugInCollection. Gli oggetti StylusPlugIn nella StylusPlugInCollection ricevono e possono modificare i punti dello stilo sul thread della penna. Gli oggetti StylusPlugIn ricevono i punti dello stilo secondo il loro ordine nel StylusPlugInCollection.

Il diagramma seguente illustra la situazione ipotetica in cui la raccolta StylusPlugIns di una UIElement contiene stylusPlugin1, un DynamicRenderere stylusPlugin2, in tale ordine.

L'ordine dei plugin Stylus influisce sull'output.

Nel diagramma precedente viene eseguito il comportamento seguente:

  1. StylusPlugin1 modifica i valori per x e y.

  2. DynamicRenderer riceve i punti dello stilo modificati ed effettua il rendering nel thread di rendering dinamico.

  3. StylusPlugin2 riceve i punti dello stilo modificati e modifica ulteriormente i valori per x e y.

  4. L'applicazione raccoglie i punti dello stilo e, al termine del tratto, esegue il rendering statico del tratto.

Si supponga che stylusPlugin1 limita i punti dello stilo a un rettangolo e stylusPlugin2 converte i punti dello stilo a destra. Nello scenario precedente, il DynamicRenderer riceve i punti dello stilo con restrizioni, ma non i punti dello stilo tradotti. Quando l'utente disegna il tratto, il tratto viene renderizzato all'interno dei limiti del rettangolo, ma non appare traslato finché l'utente non solleva la penna.

Esecuzione di operazioni con un Plug-in Stylus nel thread dell'interfaccia utente

Poiché non è possibile eseguire hit test accurati sul thread della penna, alcuni elementi potrebbero occasionalmente ricevere l'input dello stilo destinato ad altri elementi. Se è necessario assicurarsi che l'input sia stato indirizzato correttamente prima di eseguire un'operazione, è necessario sottoscrivere ed eseguire l'operazione nel metodo OnStylusDownProcessed, OnStylusMoveProcessedo OnStylusUpProcessed. Questi metodi vengono richiamati dal thread dell'applicazione dopo l'esecuzione di hit test accurati. Per iscriversi a questi metodi, chiamare il metodo NotifyWhenProcessed nel metodo che viene eseguito nel thread associato alla penna.

Il diagramma seguente illustra la relazione tra il thread della penna e il thread dell'interfaccia utente in relazione agli eventi dello stilo di un StylusPlugIn.

modelli di threading dell'inchiostro (interfaccia utente e penna)

Rendering dell'inchiostro

Quando l'utente disegna un tratto, DynamicRenderer genera l'inchiostro su un thread separato in modo che l'inchiostro appaia come un "flusso" dalla penna anche quando il thread dell'interfaccia utente è occupato. Il DynamicRenderer crea una struttura ad albero visuale nel thread di rendering dinamico man mano che raccoglie i punti dello stilo. Al termine del tratto, il DynamicRenderer chiede di ricevere una notifica quando l'applicazione esegue il passaggio di rendering successivo. Al termine del passaggio di rendering successivo, l'DynamicRenderer pulisce l'albero visivo. Il diagramma seguente illustra questo processo.

diagramma di passaggio dell'inchiostro

  1. L'utente inizia il tratto.

    1. Il DynamicRenderer crea l'albero visivo.
  2. L'utente sta disegnando il tratto.

    1. Il DynamicRenderer compila la struttura ad albero visuale.
  3. L'utente termina il tratto.

    1. Il InkPresenter aggiunge il tratto alla relativa struttura ad albero visuale.

    2. Il livello di integrazione multimediale (MIL) renderizza staticamente i tratti.

    3. Il DynamicRenderer migliora gli aspetti visivi.