Partager via


Interception de l’entrée à partir du stylet

L’architecture System.Windows.Input.StylusPlugIns fournit un mécanisme permettant d’implémenter un contrôle de bas niveau sur Stylus l’entrée ainsi que sur la création d’objets d’encre Stroke numérique. La StylusPlugIn classe fournit un mécanisme permettant d’implémenter un comportement personnalisé et de l’appliquer au flux de données provenant de l’appareil de stylet pour obtenir des performances optimales.

Cette rubrique contient les sous-sections suivantes :

Architecture

Le StylusPlugIn est l’évolution des API StylusInput, décrites dans Accéder et manipuler l'entrée du stylet.

Chacun UIElement a une StylusPlugIns propriété qui est un StylusPlugInCollection. Vous pouvez ajouter une StylusPlugIn à la propriété d’un StylusPlugIns élément pour manipuler des StylusPoint données au fur et à mesure qu’elles sont générées. les données StylusPoint se composent de toutes les propriétés prises en charge par le numériseur système, y compris les données X et les données de point Y, ainsi que les données PressureFactor.

Vos objets StylusPlugIn sont insérés directement dans le flux de données provenant de l'appareil Stylus lorsque vous ajoutez StylusPlugIn à la propriété StylusPlugIns. L’ordre dans lequel les plug-ins sont ajoutés à la StylusPlugIns collection détermine l’ordre dans lequel ils recevront des StylusPoint données. Par exemple, si vous ajoutez un plug-in de filtre qui limite l’entrée à une région particulière, puis ajoutez un plug-in qui reconnaît les mouvements tels qu’ils sont écrits, le plug-in qui reconnaît les mouvements reçoit des données filtrées StylusPoint .

Implémentation des plug-ins Stylus

Pour implémenter un plug-in, dérivez une classe de StylusPlugIn. Cette classe est appliquée au flux de données tel qu’il provient du Stylus. Dans cette classe, vous pouvez modifier les valeurs des StylusPoint données.

Avertissement

Si une StylusPlugIn lève une exception ou en provoque une, l'application se fermera. Vous devez tester soigneusement les contrôles qui consomment un StylusPlugIn et n'utiliser qu'un contrôle si vous êtes certain que le StylusPlugIn ne lève pas d'exception.

L’exemple suivant illustre un plug-in qui limite l’entrée de stylet en modifiant les valeurs X et Y dans les données StylusPoint à mesure qu’elles proviennent de l’appareil Stylus.

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


    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


    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


    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
End Class

Ajout de votre plug-in à un InkCanvas

Le moyen le plus simple d’utiliser votre plug-in personnalisé consiste à implémenter une classe dérivée d’InkCanvas et à l’ajouter à la StylusPlugIns propriété.

L’exemple suivant illustre un élément InkCanvas personnalisé qui filtre l'encre.

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

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

Si vous ajoutez un FilterInkCanvas à votre application et que vous l’exécutez, vous remarquerez que l'encre n’est pas limitée à une région tant que l’utilisateur n’a pas terminé un trait. Cela est dû au fait que le InkCanvas possède une propriété DynamicRenderer, qui est un StylusPlugIn et est déjà membre de la collection StylusPlugIns. L'élément personnalisé que StylusPlugIn vous avez ajouté à la collection StylusPlugIns reçoit les données StylusPoint après que DynamicRenderer a reçu des données. Par conséquent, les StylusPoint données ne seront pas filtrées tant que l’utilisateur n’aura pas levé le stylet pour mettre fin à un trait. Pour filtrer l'encre à mesure que l'utilisateur la dessine, vous devez insérer FilterPlugin avant DynamicRenderer.

Le code C# suivant illustre un objet personnalisé InkCanvas qui filtre l'encre pendant qu'elle est dessinée.

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

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

        this.StylusPlugIns.Insert(dynamicRenderIndex, filter);
    }
}

Conclusion

En dérivant vos propres StylusPlugIn classes et en les insérant dans StylusPlugInCollection collections, vous pouvez améliorer considérablement le comportement de vos entrées manuscrites numériques. Vous avez accès aux StylusPoint données au fur et à mesure qu’elles sont générées, ce qui vous donne la possibilité de personnaliser l’entrée Stylus . Étant donné que vous disposez d’un tel accès de bas niveau aux données, vous pouvez implémenter la collecte d'encre et le StylusPoint rendu avec des performances optimales pour votre application.

Voir aussi