Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
L’un des avantages de l’encre sur un PC tablette est qu’elle ressemble beaucoup à l’écriture avec un stylo et du papier ordinaire. 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 rendre l'encre, car il peut être bloqué. Pour résoudre ce problème, une application WPF utilise deux threads supplémentaires lorsqu’un utilisateur écrit à l'encre.
La liste suivante décrit les threads qui participent à la collecte et au rendu d’encre numérique :
Fil de stylet : le fil qui prend l'entrée du stylet. (En réalité, il s’agit d’un pool de threads, mais ce sujet le désigne en tant que fil de stylo.)
Thread d’interface utilisateur de l’application : thread qui contrôle l’interface utilisateur de l’application.
Thread de rendu dynamique : le thread qui rend l'encre numérique 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, que l'application utilise le InkCanvas ou un contrôle personnalisé similaire à celui de Créer 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
Lorsqu'un utilisateur dessine un trait, le diagramme suivant illustre le modèle de gestion des threads.
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 DynamicRenderer, acceptent les points de stylet sur le fil de stylo et ont la possibilité de les modifier avant que le InkCanvas ne les reçoive.
Le DynamicRenderer rend les points du stylet sur le thread de rendu dynamique. Cela se produit en même temps que l’étape précédente.
Le thread d'interface utilisateur InkCanvas reçoit les points de stylet.
Actions se produisant après la fin du trait par l’utilisateur
Lorsque l’utilisateur termine le dessin du trait, InkCanvas crée un objet Stroke et l’ajoute au InkPresenter, qui le rend de manière statique.
Le thread d'interface utilisateur avertit le DynamicRenderer que le trait est rendu statiquement, de sorte que le DynamicRenderer supprime sa représentation visuelle du trait.
Collection d'encre et plug-ins pour stylet
Chacun UIElement a un StylusPlugInCollection. Les StylusPlugIn objets dans la StylusPlugInCollection reçoivent et peuvent modifier les points de la plume sur le fil du 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
limite les points de stylet à un rectangle et stylusPlugin2
déplace les points de stylet vers la droite. Dans le scénario précédent, le DynamicRenderer reçoit les points de stylet restreints, 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 de stylet sur le thread de l’interface utilisateur
Étant donné que des tests de détection précis ne peuvent pas être effectués sur le fil du 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, OnStylusMoveProcessed, ou OnStylusUpProcessed méthode. Ces méthodes sont appelées par le thread d’application une fois que des tests de détection de collision précis ont été effectués. Pour vous abonner à ces méthodes, appelez la méthode NotifyWhenProcessed depuis celle qui s'exécute sur le thread de stylet.
Le diagramme suivant illustre la relation entre le fil du stylet et le fil de l'interface utilisateur par rapport aux événements du stylet d'un StylusPlugIn.
Rendu d'encre
Lorsque l’utilisateur dessine un trait, DynamicRenderer rend l’encre sur un thread distinct afin que l’encre semble s'écouler à partir du stylet, même lorsque le thread de l’interface utilisateur est occupé. Le DynamicRenderer construit une arborescence visuelle sur le thread de rendu dynamique lorsqu'il collecte des points de stylet. Lorsque l’utilisateur termine le trait, le système DynamicRenderer demande à être averti lorsque l’application effectue la prochaine passe de rendu. Une fois que l’application a terminé la prochaine passe de rendu, elle DynamicRenderer nettoie son arborescence visuelle. Le diagramme suivant illustre ce processus.
L’utilisateur commence le mouvement.
- DynamicRenderer crée l'arborescence visuelle.
L’utilisateur dessine le trait.
- DynamicRenderer génère l’arborescence visuelle.
L’utilisateur termine le trait.
Le InkPresenter ajoute le trait à son arborescence visuelle.
La couche d’intégration multimédia (MIL) restitue statiquement les traits.
DynamicRenderer améliore l'apparence des visuels.
.NET Desktop feedback