Modèle de thread de l'encre
L’un des avantages de l’encre sur un PC tablette est qu’il se sent beaucoup comme l’écriture avec un stylet et un papier réguliers. Pour ce faire, le stylet de tablette collecte les données d’entrée à un débit beaucoup plus élevé qu’une souris et affiche l’encre lorsque l’utilisateur écrit. Le thread d’interface utilisateur de l’application n’est pas suffisant pour collecter des données de stylet et afficher des entrées manuscrites, car elle peut être bloquée. Pour résoudre ce problème, une application WPF utilise deux threads supplémentaires lorsqu’un utilisateur écrit des entrées manuscrites.
La liste suivante décrit les threads qui participent à la collecte et au rendu d’encre numérique :
Thread de stylet : thread qui prend l’entrée du stylet. (En réalité, il s’agit d’un pool de threads, mais cette rubrique lui fait référence en tant que thread de stylet.)
Thread d’interface utilisateur de l’application : thread qui contrôle l’interface utilisateur de l’application.
Thread de rendu dynamique : thread qui affiche l’entrée manuscrite pendant que l’utilisateur dessine un trait. Le thread de rendu dynamique est différent du thread qui restitue d’autres éléments d’interface utilisateur pour l’application, comme mentionné dans le modèle threading Window Presentation Foundation.
Le modèle d’entrée manuscrite est identique si l’application utilise le InkCanvas contrôle personnalisé ou similaire à celui de la création d’un contrôle d’entrée manuscrite. Bien que cette rubrique traite du threading en termes de InkCanvas, les mêmes concepts s’appliquent lorsque vous créez un contrôle personnalisé.
Vue d’ensemble du threading
Le diagramme suivant illustre le modèle de thread lorsqu’un utilisateur dessine un trait :
Actions se produisant pendant que l’utilisateur dessine le trait
Lorsque l’utilisateur dessine un trait, les points de stylet entrent dans le thread de stylet. Les plug-ins de stylet, y compris les DynamicRendererpoints de stylet sur le fil de stylet, ont la possibilité de les modifier avant les InkCanvas réceptions.
Le DynamicRenderer rendu des points de stylet sur le thread de rendu dynamique. Cela se produit en même temps que l’étape précédente.
Le InkCanvas stylet reçoit les points de stylet sur le thread d’interface utilisateur.
Actions se produisant après la fin du trait par l’utilisateur
Lorsque l’utilisateur termine le dessin du trait, il InkCanvas crée un Stroke objet et l’ajoute à celui-ci InkPresenter, qui le rend statiquement.
Le thread d’interface utilisateur alerte le DynamicRenderer rendu statique du trait, de sorte que la DynamicRenderer représentation visuelle du trait est supprimée.
Collection d’encre et plug-ins stylus
Chacun UIElement a un StylusPlugInCollection. Les StylusPlugIn objets de la StylusPlugInCollection réception et peuvent modifier les points de stylet sur le thread de stylet. Les StylusPlugIn objets reçoivent les points de stylet en fonction de leur ordre dans le StylusPlugInCollection.
Le diagramme suivant illustre la situation hypothétique dans laquelle la StylusPlugIns collection d’un UIElement contient stylusPlugin1
, a DynamicRendereret stylusPlugin2
, dans cet ordre.
Dans le diagramme précédent, le comportement suivant se produit :
StylusPlugin1
modifie les valeurs de x et y.DynamicRenderer reçoit les points de stylet modifiés et les affiche sur le thread de rendu dynamique.
StylusPlugin2
reçoit les points de stylet modifiés et modifie davantage les valeurs pour x et y.L’application collecte les points de stylet et, lorsque l’utilisateur termine le trait, affiche statiquement le trait.
Supposons que stylusPlugin1
cela limite les points de stylet à un rectangle et stylusPlugin2
traduit les points de stylet à droite. Dans le scénario précédent, les DynamicRenderer points de stylet restreints sont reçus, mais pas les points de stylet traduits. Lorsque l’utilisateur dessine le trait, le trait est affiché dans les limites du rectangle, mais le trait ne semble pas être traduit tant que l’utilisateur n’a pas levé le stylet.
Exécution d’opérations avec un plug-in stylus sur le thread d’interface utilisateur
Étant donné que les tests de positionnement précis ne peuvent pas être effectués sur le thread de stylet, certains éléments peuvent parfois recevoir une entrée de stylet destinée à d’autres éléments. Si vous devez vous assurer que l’entrée a été routée correctement avant d’effectuer une opération, abonnez-vous et effectuez l’opération dans le OnStylusDownProcessed, OnStylusMoveProcessedou OnStylusUpProcessed la méthode. Ces méthodes sont appelées par le thread d’application une fois que des tests de positionnement précis ont été effectués. Pour vous abonner à ces méthodes, appelez la NotifyWhenProcessed méthode dans la méthode qui se produit sur le thread de stylet.
Le diagramme suivant illustre la relation entre le thread de stylet et le thread d’interface utilisateur par rapport aux événements de stylet d’un StylusPlugIn.
Rendu de l’entrée manuscrite
Lorsque l’utilisateur dessine un trait, DynamicRenderer restitue l’entrée manuscrite sur un thread distinct afin que l’entrée manuscrite apparaisse « flow » à partir du stylet, même lorsque le thread d’interface utilisateur est occupé. Le DynamicRenderer modèle génère une arborescence visuelle sur le thread de rendu dynamique, car il collecte des points de stylet. Lorsque l’utilisateur termine le trait, il DynamicRenderer demande d’être averti lorsque l’application effectue la passe de rendu suivante. Une fois que l’application a terminé la passe de rendu suivante, l’propre DynamicRenderer monter son arborescence visuelle. Le diagramme suivant illustre ce processus.
L’utilisateur commence le trait.
- L’arborescence DynamicRenderer visuelle est créée.
L’utilisateur dessine le trait.
- Génère DynamicRenderer l’arborescence visuelle.
L’utilisateur termine le trait.
Ajoute InkPresenter le trait à son arborescence visuelle.
La couche d’intégration multimédia (MIL) restitue statiquement les traits.
Le DynamicRenderer propre les visuels.
.NET Desktop feedback