Compartir a través de


El modelo de objeto de tinta: Windows Forms y COM frente a WPF

Básicamente hay tres plataformas que admiten la entrada de lápiz digital: la plataforma de Windows Forms de Tablet PC, la plataforma COM de Tablet PC y la plataforma de Windows Presentation Foundation (WPF). Las plataformas Windows Forms y COM comparten un modelo de objetos similar, pero el modelo de objetos de la plataforma WPF es sustancialmente diferente. En este tema se describen las diferencias de alto nivel para que los desarrolladores que han trabajado con un modelo de objetos puedan comprender mejor el otro.

Habilitación de tinta digital en una aplicación

Las tres plataformas envían objetos y controles que permiten a una aplicación recibir la entrada de un lápiz de tableta. Las plataformas Windows Forms y COM se incluyen con las clases Microsoft.Ink.InkPicture, Microsoft.Ink.InkEdit, Microsoft.Ink.InkOverlay y Microsoft.Ink.InkCollector . Microsoft.Ink.InkPicture y Microsoft.Ink.InkEdit son controles que puede agregar a una aplicación para recopilar entradas de lápiz. Microsoft.Ink.InkOverlay y Microsoft.Ink.InkCollector se pueden adjuntar a una ventana existente para habilitar las ventanas y los controles personalizados.

La plataforma WPF incluye el InkCanvas control . Puede agregar un elemento InkCanvas a la aplicación y empezar a recopilar la entrada de lápiz inmediatamente. InkCanvas, el usuario puede copiar, seleccionar y cambiar el tamaño de la tinta. También puede agregar otros controles a InkCanvas, y el usuario puede escribir sobre esos controles. Puede crear un control personalizado habilitado para el uso de lápiz táctil agregando un elemento InkPresenter y recopilando sus puntos de lápiz táctil.

En la tabla siguiente se muestra dónde obtener más información sobre cómo habilitar la entrada de lápiz en una aplicación:

Para En la plataforma WPF... En las plataformas Windows Forms/COM...
Agregar un control habilitado para tinta a una aplicación Consulte Primeros pasos con Ink. Consulte Ejemplo de formulario de notificaciones automáticas
Habilitar la entrada de lápiz en un control personalizado Consulte Creación de un control de entrada de lápiz. Vea Ejemplo de Portapapeles de tinta.

Datos de lápiz

En las plataformas Windows Forms y COM, Microsoft.Ink.InkCollector, Microsoft.Ink.InkOverlay, Microsoft.Ink.InkEdit y Microsoft.Ink.InkPicture exponen un objeto Microsoft.Ink.Ink . El objeto Microsoft.Ink.Ink contiene los datos de uno o varios objetos Microsoft.Ink.Stroke y expone métodos y propiedades comunes para administrar y manipular esos trazos. El objeto Microsoft.Ink.Ink administra la duración de los trazos que contiene; El objeto Microsoft.Ink.Ink crea y elimina los trazos que posee. Cada Microsoft.Ink.Stroke tiene un identificador único dentro de su objeto primario Microsoft.Ink.Ink .

En la plataforma WPF, la clase System.Windows.Ink.Stroke posee y administra su propio ciclo de vida. Un grupo de Stroke objetos se puede recopilar juntos en StrokeCollection, que proporciona métodos para operaciones comunes de administración de datos de tinta, como pruebas de impacto, borrado, transformación y serialización de la tinta. Un Stroke puede pertenecer a cero, uno o varios StrokeCollection objetos en cualquier momento dado. En lugar de tener un objeto Microsoft.Ink.Ink, InkCanvas y InkPresenter contienen un System.Windows.Ink.StrokeCollection.

El siguiente par de ilustraciones compara los modelos de objetos de datos de tinta. En las plataformas Windows Forms y COM, el objeto Microsoft.Ink.Ink limita la vida útil de los objetos Microsoft.Ink.Stroke, y los paquetes del lápiz pertenecen a los trazos individuales. Dos o más trazos pueden hacer referencia al mismo objeto Microsoft.Ink.DrawingAttributes , como se muestra en la ilustración siguiente.

Diagrama del modelo de objetos de lápiz para COM/Winforms.

En WPF, cada uno System.Windows.Ink.Stroke es un objeto de Common Language Runtime que existe siempre que algo tenga una referencia a él. Cada Stroke hace referencia a un objeto StylusPointCollection y System.Windows.Ink.DrawingAttributes, todos ellos son objetos de Common Language Runtime.

Diagrama del modelo de objetos de tinta para WPF.

En la tabla siguiente se compara cómo realizar algunas tareas comunes en la plataforma WPF y en las plataformas Windows Forms y COM.

Tarea Windows Presentation Foundation Formularios Windows Forms y COM
Ahorrar tinta Save Microsoft.Ink.Ink.Save
Cargar tinta Cree un StrokeCollection con el constructor StrokeCollection. Microsoft.Ink.Ink.Load
Prueba de detección de colisiones HitTest Microsoft.Ink.Ink.HitTest
Copiar tinta CopySelection Microsoft.Ink.Ink.ClipboardCopy
Pegar tinta Paste Microsoft.Ink.Ink.ClipboardPaste
Acceso a propiedades personalizadas en una colección de trazos AddPropertyData (las propiedades se almacenan internamente y se accede a ellas a través AddPropertyDatade , RemovePropertyDatay ContainsPropertyData) Usar Microsoft.Ink.Ink.ExtendedProperties

Uso compartido de tinta entre plataformas

Aunque las plataformas tienen diferentes modelos de objetos para los datos de entrada de lápiz, compartir los datos entre las plataformas es muy fácil. En los siguientes ejemplos, se guarda la tinta de una aplicación de Windows Forms y se carga la tinta en una aplicación de Windows Presentation Foundation.

using Microsoft.Ink;
using System.Drawing;
Imports Microsoft.Ink
Imports System.Drawing
/// <summary>
/// Saves the digital ink from a Windows Forms application.
/// </summary>
/// <param name="inkToSave">An Ink object that contains the
/// digital ink.</param>
/// <returns>A MemoryStream containing the digital ink.</returns>
MemoryStream SaveInkInWinforms(Ink inkToSave)
{
    byte[] savedInk = inkToSave.Save();

    return (new MemoryStream(savedInk));
}
'/ <summary>
'/ Saves the digital ink from a Windows Forms application.
'/ </summary>
'/ <param name="inkToSave">An Ink object that contains the 
'/ digital ink.</param>
'/ <returns>A MemoryStream containing the digital ink.</returns>
Function SaveInkInWinforms(ByVal inkToSave As Ink) As MemoryStream 
    Dim savedInk As Byte() = inkToSave.Save()
    
    Return New MemoryStream(savedInk)

End Function 'SaveInkInWinforms
using System.Windows.Ink;
Imports System.Windows.Ink

/// <summary>
/// Loads digital ink into a StrokeCollection, which can be
/// used by a WPF application.
/// </summary>
/// <param name="savedInk">A MemoryStream containing the digital ink.</param>
public void LoadInkInWPF(MemoryStream inkStream)
{
    strokes = new StrokeCollection(inkStream);
}
'/ <summary>
'/ Loads digital ink into a StrokeCollection, which can be 
'/ used by a WPF application.
'/ </summary>
'/ <param name="savedInk">A MemoryStream containing the digital ink.</param>
Public Sub LoadInkInWPF(ByVal inkStream As MemoryStream) 
    strokes = New StrokeCollection(inkStream)

End Sub

En los siguientes ejemplos, se guarda la tinta digital de una aplicación de Windows Presentation Foundation y se carga la tinta digital en una aplicación de Windows Forms.

using System.Windows.Ink;
Imports System.Windows.Ink

/// <summary>
/// Saves the digital ink from a WPF application.
/// </summary>
/// <param name="inkToSave">A StrokeCollection that contains the
/// digital ink.</param>
/// <returns>A MemoryStream containing the digital ink.</returns>
MemoryStream SaveInkInWPF(StrokeCollection strokesToSave)
{
    MemoryStream savedInk = new MemoryStream();

    strokesToSave.Save(savedInk);

    return savedInk;
}
'/ <summary>
'/ Saves the digital ink from a WPF application.
'/ </summary>
'/ <param name="inkToSave">A StrokeCollection that contains the 
'/ digital ink.</param>
'/ <returns>A MemoryStream containing the digital ink.</returns>
Function SaveInkInWPF(ByVal strokesToSave As StrokeCollection) As MemoryStream 
    Dim savedInk As New MemoryStream()
    
    strokesToSave.Save(savedInk)
    
    Return savedInk

End Function 'SaveInkInWPF

using Microsoft.Ink;
using System.Drawing;
Imports Microsoft.Ink
Imports System.Drawing
/// <summary>
/// Loads digital ink into a Windows Forms application.
/// </summary>
/// <param name="savedInk">A MemoryStream containing the digital ink.</param>
public void LoadInkInWinforms(MemoryStream savedInk)
{
    theInk = new Ink();
    theInk.Load(savedInk.ToArray());
}
'/ <summary>
'/ Loads digital ink into a Windows Forms application.
'/ </summary>
'/ <param name="savedInk">A MemoryStream containing the digital ink.</param>
Public Sub LoadInkInWinforms(ByVal savedInk As MemoryStream) 
    theInk = New Ink()
    theInk.Load(savedInk.ToArray())

End Sub

Eventos desde el lápiz de tableta

Microsoft.Ink.InkOverlay, Microsoft.Ink.InkCollector y Microsoft.Ink.InkPicture en las plataformas Windows Forms y COM reciben eventos cuando el usuario introduce los datos del lápiz. Microsoft.Ink.InkOverlay o Microsoft.Ink.InkCollector está asociado a una ventana o a un control, y puede suscribirse a los eventos generados por los datos de entrada de la tableta. El hilo en el que se producen estos eventos depende de si los eventos se generan con un lápiz, un mouse o mediante programación. Para obtener más información sobre el subproceso en relación con estos eventos, vea Consideraciones generales sobre subprocesos y subprocesos en los que se puede desencadenar un evento.

En la plataforma Windows Presentation Foundation, la clase UIElement tiene eventos para la entrada de lápiz. Esto significa que cada control expone el conjunto completo de eventos de lápiz óptico. Los eventos de lápiz óptico tienen pares de eventos de tunelización o propagación y siempre se producen en el subproceso de la aplicación. Para obtener más información, consulte Información general sobre eventos enrutados.

En el diagrama siguiente se muestran las comparaciones de los modelos de objetos de las clases que generan eventos de lápiz óptico. El modelo de objetos de Windows Presentation Foundation muestra solo los eventos de propagación, no los homólogos del evento de tunelización.

Diagrama de los eventos stylus en WPF frente a Winforms.

Datos de lápiz digital

Las tres plataformas proporcionan formas de interceptar y manipular los datos que proceden de un lápiz de tableta. En las plataformas Windows Forms y COM, esto se logra creando un Microsoft.StylusInput.RealTimeStylus, adjuntando una ventana o control a ella, y creando una clase que implemente la interfaz Microsoft.StylusInput.IStylusSyncPlugin o Microsoft.StylusInput.IStylusAsyncPlugin . A continuación, el complemento personalizado se agrega a la colección de complementos de Microsoft.StylusInput.RealTimeStylus. Para obtener más información sobre este modelo de objetos, consulte Arquitectura de las API stylusInput.

En la plataforma WPF, la UIElement clase expone una colección de complementos, similar al diseño de Microsoft.StylusInput.RealTimeStylus. Para interceptar los datos del lápiz, cree una clase que herede de StylusPlugIn y agregue el objeto a la StylusPlugIns colección de UIElement. Para obtener más información sobre esta interacción, vea Intercepting Input from the Stylus(Intercepting Input from the Stylus).

En todas las plataformas, un grupo de subprocesos recibe los datos de tinta a través de eventos de lápiz y los envía al subproceso de la aplicación. Para obtener más información sobre el subproceso en las plataformas COM y Windows, consulte Consideraciones sobre subprocesos para las API StylusInput. Para obtener más información sobre el subproceso en el software de presentación de Windows, vea El modelo de subprocesos de entrada de lápiz.

En la ilustración siguiente se comparan los modelos de objetos de las clases que reciben datos de lápiz en el grupo de subprocesos de lápiz.

Diagrama del modelo StylusPlugin WPF frente a Winforms.