Interceptar entradas del lápiz ópticoIntercepting Input from the Stylus

El System.Windows.Input.StylusPlugIns arquitectura proporciona un mecanismo para implementar el control de bajo nivel a través de Stylus de entrada y la creación de la entrada de lápiz digital Stroke objetos.The System.Windows.Input.StylusPlugIns architecture provides a mechanism for implementing low-level control over Stylus input and the creation of digital ink Stroke objects. La StylusPlugIn clase proporciona un mecanismo para implementar un comportamiento personalizado y aplicarlo a la secuencia de datos procedente del dispositivo de lápiz para un rendimiento óptimo.The StylusPlugIn class provides a mechanism for you to implement custom behavior and apply it to the stream of data coming from the stylus device for the optimal performance.

Este tema contiene las siguientes subsecciones:This topic contains the following subsections:

ArquitecturaArchitecture

El StylusPlugIn es la evolución de la StylusInput API, se describe en acceder y manipular entradas manuscritas, en el Software de Microsoft Windows XP Tablet PC Edition Kit de desarrollo 1.7.The StylusPlugIn is the evolution of the StylusInput APIs, described in Accessing and Manipulating Pen Input, in the Microsoft Windows XP Tablet PC Edition Software Development Kit 1.7.

Cada UIElement tiene un StylusPlugIns propiedad que es un StylusPlugInCollection.Each UIElement has a StylusPlugIns property that is a StylusPlugInCollection. Puede agregar un StylusPlugIn a un elemento StylusPlugIns propiedad manipular StylusPoint datos a medida que se generan.You can add a StylusPlugIn to an element's StylusPlugIns property to manipulate StylusPoint data as it is generated. StylusPoint constan de datos de todas las propiedades admitidas por el digitalizador del sistema, incluidos el X y Y punto de datos, así como PressureFactor datos.StylusPoint data consists of all the properties supported by the system digitizer, including the X and Y point data, as well as PressureFactor data.

Su StylusPlugIn objetos se insertan directamente en el flujo de datos procedentes de la Stylus dispositivo cuando se agrega el StylusPlugIn a la StylusPlugIns propiedad.Your StylusPlugIn objects are inserted directly into the stream of data coming from the Stylus device when you add the StylusPlugIn to the StylusPlugIns property. El orden en que se agregan los complementos a la StylusPlugIns colección determina el orden en el que recibirán StylusPoint datos.The order in which plug-ins are added to the StylusPlugIns collection dictates the order in which they will receive StylusPoint data. Por ejemplo, si agrega un complemento de filtro que restringe la entrada a una región determinada y, a continuación, agregar un complemento que reconoce los gestos de medida que se escriben, el complemento que reconoce los gestos recibirá filtrados StylusPoint datos.For example, if you add a filter plug-in that restricts input to a particular region, and then add a plug-in that recognizes gestures as they are written, the plug-in that recognizes gestures will receive filtered StylusPoint data.

Implementar complementos de lápizImplementing Stylus Plug-ins

Para implementar un complemento, derive una clase de StylusPlugIn.To implement a plug-in, derive a class from StylusPlugIn. Esta clase es aplica a la secuencia de datos a medida que llegan desde la Stylus.This class is applied o the stream of data as it comes in from the Stylus. En esta clase se pueden modificar los valores de la StylusPoint datos.In this class you can modify the values of the StylusPoint data.

Precaución

Si un StylusPlugIn inicia o produce una excepción, la aplicación que se cerrará.If a StylusPlugIn throws or causes an exception, the application will close. Debe probar exhaustivamente los controles que consumen un StylusPlugIn y solo puede utilizar un control si está seguro de que el StylusPlugIn no se iniciará una excepción.You should thoroughly test controls that consume a StylusPlugIn and only use a control if you are certain the StylusPlugIn will not throw an exception.

En el ejemplo siguiente se muestra un complemento que restringe la entrada de lápiz óptico modificando el X y Y valores en el StylusPoint datos a medida que proceden la Stylus dispositivo.The following example demonstrates a plug-in that restricts the stylus input by modifying the X and Y values in the StylusPoint data as it comes in from the Stylus device.

using System;
using System.Windows.Media;
using System.Windows;
using System.Windows.Input.StylusPlugIns;
using System.Windows.Input;
using System.Windows.Ink;
Imports System
Imports System.Windows.Media
Imports System.Windows
Imports System.Windows.Input.StylusPlugIns
Imports System.Windows.Input
Imports System.Windows.Ink
// A StylusPlugin that restricts the input area.
class FilterPlugin : StylusPlugIn
{
    protected override void OnStylusDown(RawStylusInput rawStylusInput)
    {
        // Call the base class before modifying the data.
        base.OnStylusDown(rawStylusInput);

        // Restrict the stylus input.
        Filter(rawStylusInput);
    }

    protected override void OnStylusMove(RawStylusInput rawStylusInput)
    {
        // Call the base class before modifying the data.
        base.OnStylusMove(rawStylusInput);

        // Restrict the stylus input.
        Filter(rawStylusInput);
    }

    protected override void OnStylusUp(RawStylusInput rawStylusInput)
    {
        // Call the base class before modifying the data.
        base.OnStylusUp(rawStylusInput);

        // Restrict the stylus input
        Filter(rawStylusInput);
    }

    private void Filter(RawStylusInput rawStylusInput)
    {
        // Get the StylusPoints that have come in.
        StylusPointCollection stylusPoints = rawStylusInput.GetStylusPoints();

        // Modify the (X,Y) data to move the points 
        // inside the acceptable input area, if necessary.
        for (int i = 0; i < stylusPoints.Count; i++)
        {
            StylusPoint sp = stylusPoints[i];
            if (sp.X < 50) sp.X = 50;
            if (sp.X > 250) sp.X = 250;
            if (sp.Y < 50) sp.Y = 50;
            if (sp.Y > 250) sp.Y = 250;
            stylusPoints[i] = sp;
        }

        // Copy the modified StylusPoints back to the RawStylusInput.
        rawStylusInput.SetStylusPoints(stylusPoints);
    }
}
' A StylusPlugin that restricts the input area.
Class FilterPlugin
    Inherits StylusPlugIn

    Protected Overrides Sub OnStylusDown(ByVal rawStylusInput As RawStylusInput)
        ' Call the base class before modifying the data.
        MyBase.OnStylusDown(rawStylusInput)

        ' Restrict the stylus input.
        Filter(rawStylusInput)

    End Sub 'OnStylusDown


    Protected Overrides Sub OnStylusMove(ByVal rawStylusInput As RawStylusInput)
        ' Call the base class before modifying the data.
        MyBase.OnStylusMove(rawStylusInput)

        ' Restrict the stylus input.
        Filter(rawStylusInput)

    End Sub 'OnStylusMove


    Protected Overrides Sub OnStylusUp(ByVal rawStylusInput As RawStylusInput)
        ' Call the base class before modifying the data.
        MyBase.OnStylusUp(rawStylusInput)

        ' Restrict the stylus input
        Filter(rawStylusInput)

    End Sub 'OnStylusUp


    Private Sub Filter(ByVal rawStylusInput As RawStylusInput)
        ' Get the StylusPoints that have come in.
        Dim stylusPoints As StylusPointCollection = rawStylusInput.GetStylusPoints()

        ' Modify the (X,Y) data to move the points 
        ' inside the acceptable input area, if necessary.
        Dim i As Integer
        For i = 0 To stylusPoints.Count - 1
            Dim sp As StylusPoint = stylusPoints(i)
            If sp.X < 50 Then
                sp.X = 50
            End If
            If sp.X > 250 Then
                sp.X = 250
            End If
            If sp.Y < 50 Then
                sp.Y = 50
            End If
            If sp.Y > 250 Then
                sp.Y = 250
            End If
            stylusPoints(i) = sp
        Next i

        ' Copy the modified StylusPoints back to the RawStylusInput.
        rawStylusInput.SetStylusPoints(stylusPoints)

    End Sub 'Filter
End Class 'FilterPlugin

Agregar el complemento a un InkCanvasAdding Your Plug-in to an InkCanvas

Es la manera más fácil de utilizar un complemento personalizado implementar una clase que derive de InkCanvas y agregarla a la StylusPlugIns propiedad.The easiest way to use your custom plug-in is to implement a class that derives from InkCanvas and add it to the StylusPlugIns property.

En el ejemplo siguiente se muestra un personalizado InkCanvas que filtra la entrada de lápiz.The following example demonstrates a custom InkCanvas that filters the ink.

public class FilterInkCanvas : InkCanvas
{
    FilterPlugin filter = new FilterPlugin();

    public FilterInkCanvas()
        : base()
    {
        this.StylusPlugIns.Add(filter);
    }
}

Si agrega un FilterInkCanvas a su aplicación y la ejecución, observará que la entrada de lápiz no se restringen a una región hasta después de que el usuario completa un trazo.If you add a FilterInkCanvas to your application and run it, you will notice that the ink isn't restricted to a region until after the user completes a stroke. Esto es porque el InkCanvas tiene un DynamicRenderer propiedad, que es un StylusPlugIn y ya es miembro de la StylusPlugIns colección.This is because the InkCanvas has a DynamicRenderer property, which is a StylusPlugIn and is already a member of the StylusPlugIns collection. Personalizado StylusPlugIn que ha agregado a la StylusPlugIns colección recibe el StylusPoint datos después de DynamicRenderer recibe los datos.The custom StylusPlugIn you added to the StylusPlugIns collection receives the StylusPoint data after DynamicRenderer receives data. Como resultado, el StylusPoint datos no se filtrarán hasta después de que el usuario levanta el lápiz para finalizar un trazo.As a result, the StylusPoint data will not be filtered until after the user lifts the pen to end a stroke. Para filtrar la entrada de lápiz como el usuario lo dibuja, debe insertar el FilterPlugin antes de la DynamicRenderer.To filter the ink as the user draws it, you must insert the FilterPlugin before the DynamicRenderer.

El código de C# siguiente muestra un personalizado InkCanvas que filtra la entrada de lápiz mientras se dibuja.The following C# code demonstrates a custom InkCanvas that filters the ink as it is drawn.

public class DynamicallyFilteredInkCanvas : InkCanvas
{
    FilterPlugin filter = new FilterPlugin();

    public DynamicallyFilteredInkCanvas()
        : base()
    {
        int dynamicRenderIndex = 
            this.StylusPlugIns.IndexOf(this.DynamicRenderer);
        
        this.StylusPlugIns.Insert(dynamicRenderIndex, filter);

    }

}

ConclusiónConclusion

Al derivar sus propias StylusPlugIn clases e insertándolos en StylusPlugInCollection colecciones, puede mejorar considerablemente el comportamiento de la entrada de lápiz digital.By deriving your own StylusPlugIn classes and inserting them into StylusPlugInCollection collections, you can greatly enhance the behavior of your digital ink. Tener acceso a la StylusPoint datos a medida que se generan, lo que le ofrece la oportunidad de personalizar el Stylus entrada.You have access to the StylusPoint data as it is generated, giving you the opportunity to customize the Stylus input. Dado que tienen ese acceso de bajo nivel para el StylusPoint datos, puede implementar la recopilación de tinta y la representación con un rendimiento óptimo de la aplicación.Because you have such low-level access to the StylusPoint data, you can implement ink collection and rendering with optimal performance for your application.

Vea tambiénSee also