Condividi tramite


Intercettazione dell'input dello stilo

L'architettura System.Windows.Input.StylusPlugIns fornisce un meccanismo per l'implementazione del controllo di basso livello sull'input di Stylus e la creazione di oggetti Stroke di input penna. La classe StylusPlugIn fornisce un meccanismo per implementare il comportamento personalizzato e applicarlo al flusso di dati provenienti dal dispositivo stilo per prestazioni ottimali.

In questo argomento sono contenute le seguenti sottosezioni:

  • Architettura

  • Implementazione dei plug-in dello stilo

  • Aggiunta del plug-in a un InkCanvas

  • Conclusione

Architettura

La classe StylusPlugIn rappresenta l'evoluzione delle API StylusInput, descritte nel documento Accesso e modifica dell'input penna, in Microsoft Windows XP Tablet PC Edition Software Development Kit 1.7

Ogni oggetto UIElement include una proprietà StylusPlugIns che corrisponde a un oggetto StylusPlugInCollection. È possibile aggiungere un oggetto StylusPlugIn alla proprietà StylusPlugIns di un elemento per modificare i dati di StylusPoint al momento della generazione. I dati di StylusPoint sono costituiti da tutte le proprietà supportate dal digitalizzatore del sistema, inclusi i dati dei punti X e Y e i dati PressureFactor.

Gli oggetti StylusPlugIn vengono inseriti direttamente nel flusso di dati provenienti dal dispositivo Stylus quando si aggiunge l'oggetto StylusPlugIn alla proprietà StylusPlugIns. L'ordine in cui i plug-in vengono aggiunti all'insieme StylusPlugIns definisce l'ordine in cui riceveranno i dati StylusPoint. Ad esempio, se si aggiunge un plug-in di filtro che restringe l'input ad una particolare area e quindi si aggiunge un plug-in che riconosce i movimenti quando vengono scritti, tale plug-in riceverà dati StylusPoint filtrati.

Implementazione dei plug-in dello stilo

Per implementare un plug-in, derivare una classe da StylusPlugIn. Questa classe viene applicata al flusso di dati provenienti dall'oggetto Stylus. In questa classe è possibile modificare i valori dei dati StylusPoint.

Nota di avvisoAttenzione

Se una classe StylusPlugIn genera o causa un'eccezione, l'applicazione verrà chiusa.È necessario svolgere test accurati sui controlli che utilizzano un oggetto StylusPlugIn e utilizzare un controllo solo se si è certi che l'oggetto StylusPlugIn non genererà un'eccezione.

Nell'esempio seguente viene illustrato un plug-in che restringe l'input dello stilo modificando i valori X e Y nei dati StylusPoint provenienti dal dispositivo Stylus.

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
    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
using System;
using System.Windows.Media;
using System.Windows;
using System.Windows.Input.StylusPlugIns;
using System.Windows.Input;
using 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);
    }
}

Aggiunta del plug-in a un InkCanvas

Il modo più semplice per utilizzare il plug-in personalizzato consiste nell'implementare una classe che deriva da InkCanvas e aggiungerla alla proprietà StylusPlugIns.

Nell'esempio seguente viene illustrato un oggetto InkCanvas personalizzato che filtra l'input penna.

Public Class FilterInkCanvas
    Inherits InkCanvas
    Private filter As New FilterPlugin()


    Public Sub New()
        Me.StylusPlugIns.Add(filter)

    End Sub 'New
End Class 'FilterInkCanvas
public class FilterInkCanvas : InkCanvas
{
    FilterPlugin filter = new FilterPlugin();

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

Se si aggiunge un oggetto FilterInkCanvas all'applicazione e la si esegue, si noterà che l'input penna viene limitato a un'area solo dopo che l'utente completa un tratto. Ciò è dovuto al fatto che l'oggetto InkCanvas include una proprietà DynamicRenderer che corrisponde a un oggetto StylusPlugIn ed è già un membro dell'insieme StylusPlugIns. L'oggetto StylusPlugIn personalizzato aggiunto all'insieme StylusPlugIns riceve i dati StylusPoint dopo che DynamicRenderer riceve dati. Di conseguenza, i dati StylusPoint verranno filtrati solo dopo che l'utente solleva la penna per terminare un tratto. Per filtrare l'input penna via via che viene tracciato dall'utente, è necessario inserire l'oggetto FilterPlugin prima dell'oggetto DynamicRenderer.

Nel codice C# seguente viene illustrato un oggetto InkCanvas personalizzato che filtra l'input penna via via che viene tracciato.

Public Class DynamicallyFilteredInkCanvas
    Inherits InkCanvas

    Private filter As New FilterPlugin()

    Public Sub New()
        Dim dynamicRenderIndex As Integer = Me.StylusPlugIns.IndexOf(Me.DynamicRenderer)

        Me.StylusPlugIns.Insert(dynamicRenderIndex, filter)

    End Sub 'New 

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

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

        this.StylusPlugIns.Insert(dynamicRenderIndex, filter);

    }

}

Conclusione

Derivando le classi StylusPlugIn e inserendole negli insiemi StylusPlugInCollection, è possibile migliorare notevolmente il comportamento dell'input penna. Ottenendo l'accesso ai dati StylusPoint mentre vengono generati, è possibile personalizzare l'input Stylus. Grazie all'accesso di basso livello ai dati StylusPoint, è possibile implementare la raccolta e il rendering dell'input penna con prestazioni ottimali per l'applicazione.

Vedere anche

Altre risorse

Gestione avanzata dell'input penna

Accesso e modifica dell'input penna