Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Una de las ventajas de la tinta en un PC Tablet es que se siente muy parecido a escribir con un bolígrafo y papel normales. Para ello, el lápiz de tableta recopila datos de entrada a una velocidad mucho mayor que el mouse y representa la entrada de lápiz mientras el usuario escribe. El subproceso de la interfaz de usuario (UI) de la aplicación no es suficiente para recopilar datos del lápiz y renderizar el trazo de lápiz, ya que puede bloquearse. Para resolver esto, una aplicación WPF usa dos subprocesos adicionales cuando un usuario escribe tinta.
En la lista siguiente se describen los subprocesos que participan en la recopilación y representación de la tinta digital.
Hilo de lápiz: el hilo que toma la información del lápiz óptico. (En realidad, se trata de un grupo de hilos, pero este tema hace referencia a él como un hilo de lápiz).
Subproceso de interfaz de usuario de la aplicación: el subproceso que controla la interfaz de usuario de la aplicación.
Hilo de renderizado dinámico: el hilo que renderiza la tinta mientras el usuario dibuja un trazo. El subproceso de representación dinámica es diferente del subproceso que representa otros elementos de interfaz de usuario para la aplicación, como se mencionó en El modelo de subprocesos de Windows Presentation Foundation.
El modelo de entrada manuscrita es el mismo tanto si la aplicación usa el InkCanvas como si utiliza un control personalizado similar al de Crear un control de entrada manuscrita. Aunque en este tema se describe el subproceso en términos de InkCanvas, se aplican los mismos conceptos al crear un control personalizado.
Información general sobre subprocesos
En el diagrama siguiente se muestra el modelo de hilos cuando un usuario dibuja un trazo.
Acciones que se producen mientras el usuario dibuja el trazo
Cuando el usuario dibuja un trazo, los puntos del estilógrafo se procesan en el hilo del bolígrafo. Los complementos de lápiz, incluido el DynamicRenderer, aceptan los puntos de lápiz en el hilo del lápiz y tienen la oportunidad de modificarlos antes de que los reciba el InkCanvas.
DynamicRenderer representa los puntos del lápiz óptico en el subproceso de representación dinámica. Esto sucede al mismo tiempo que el paso anterior.
InkCanvas recibe los puntos del lápiz óptico en el subproceso de la interfaz de usuario.
Acciones que ocurren después de que el usuario termine el trazo
Cuando el usuario termina de dibujar el trazo, el InkCanvas crea un objeto Stroke y lo agrega al InkPresenter, que lo representa de forma estática.
El hilo de la interfaz de usuario alerta al DynamicRenderer de que el trazo se representa estáticamente, y DynamicRenderer elimina su representación visual del trazo.
Colección de lápiz y complementos de lápiz
Cada UIElement tiene un StylusPlugInCollection. Los StylusPlugIn objetos en la StylusPlugInCollection reciben y pueden modificar los puntos del lápiz en el hilo del lápiz. Los StylusPlugIn objetos reciben los puntos del lápiz óptico según su orden en el StylusPlugInCollection.
En el siguiente diagrama se ilustra la situación hipotética en la que la colección de StylusPlugIns contiene UIElement, stylusPlugin1 y DynamicRenderer, en ese orden.
En el diagrama anterior, tiene lugar el siguiente comportamiento:
StylusPlugin1modifica los valores de x e y.DynamicRenderer recibe los puntos de lápiz modificados y los representa en el subproceso de representación dinámica.
StylusPlugin2recibe los puntos del lápiz óptico modificados y modifica aún más los valores de x e y.La aplicación recopila los puntos del lápiz óptico y, cuando el usuario finaliza el trazo, representa estáticamente el trazo.
Supongamos que stylusPlugin1 restringe los puntos del lápiz óptico a un rectángulo y stylusPlugin2 traduce los puntos del lápiz a la derecha. En el escenario anterior, DynamicRenderer recibe los puntos de lápiz óptico restringidos, pero no los puntos de lápiz óptico traducidos. Cuando el usuario dibuja el trazo, el trazo se representa dentro de los límites del rectángulo, pero el trazo no parece traducirse hasta que el usuario levante el lápiz.
Ejecución de operaciones con un plugin Stylus en el hilo de la interfaz de usuario
Dado que no se pueden realizar pruebas de intersección precisas en el hilo de lápiz, algunos elementos pueden recibir ocasionalmente entradas de lápiz destinadas a otros elementos. Si necesita asegurarse de que la entrada se enrute correctamente antes de realizar una operación, suscríbase y realice la operación en los métodos OnStylusDownProcessed, OnStylusMoveProcessed o OnStylusUpProcessed. El subproceso de aplicación invoca estos métodos después de realizar pruebas de posicionamiento precisas. Para suscribirse a estos métodos, llame al método NotifyWhenProcessed que ocurre en el hilo de la pluma.
En el siguiente diagrama se ilustra la relación entre el subproceso del lápiz y el subproceso de la interfaz de usuario con respecto a los eventos de lápiz de un StylusPlugIn.
Renderizado de tinta
A medida que el usuario dibuja un trazo, DynamicRenderer representa la entrada de lápiz en un subproceso independiente para que la entrada de lápiz aparezca como "flujo" desde el lápiz incluso cuando el subproceso de la interfaz de usuario esté ocupado. DynamicRenderer construye un árbol visual en el subproceso de representación dinámica a medida que recopila puntos de lápiz. Cuando el usuario finaliza el trazo, DynamicRenderer solicita ser notificado cuando la aplicación haga el siguiente paso de representación. Una vez que la aplicación complete el paso de representación siguiente, DynamicRenderer limpia su árbol visual. En el diagrama siguiente se muestra este proceso.
El usuario comienza el trazo.
- DynamicRenderer crea el árbol visual.
El usuario está dibujando el trazo.
- Construye DynamicRenderer el árbol visual.
El usuario finaliza el trazo.
InkPresenter incorpora el trazo a su árbol visual.
La capa de integración multimedia (MIL) representa estáticamente los trazos.
DynamicRenderer limpia los elementos visuales.
.NET Desktop feedback