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 granulaire sur l'entrée de données Stylus et la création d'objets d'encre numérique Stroke. La classe StylusPlugIn 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 StylusInput API, décrites dans Accès et manipulation de l'entrée de stylet.

Chaque UIElement possède une propriété StylusPlugIns qui est un(e) StylusPlugInCollection. Vous pouvez ajouter une StylusPlugIn à la propriété StylusPlugIns d’un élément pour manipuler des données StylusPoint à 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 de points X et Y, ainsi que les données de PressureFactor.

Vos objets StylusPlugIn sont insérés directement dans le flux de données provenant de l’appareil Stylus lorsque vous ajoutez le StylusPlugIn à la propriété StylusPlugIns. L’ordre dans lequel les plug-ins sont ajoutés à la collection StylusPlugIns détermine l’ordre dans lequel ils recevront des données StylusPoint. 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 au fur et à mesure qu'il provient du Stylus. Dans cette classe, vous pouvez modifier les valeurs des données StylusPoint.

Prudence

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

L’exemple suivant illustre un plug-in qui limite l’entrée de stylet en modifiant les valeurs de X et de Y dans les données StylusPoint telles 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 propriété StylusPlugIns.

L’exemple suivant démontre une InkCanvas personnalisée qui filtre l’encre.

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

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

Si vous ajoutez une 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. Ceci 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. Le StylusPlugIn personnalisé que 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 données StylusPoint ne seront pas filtrées jusqu'à ce que l'utilisateur ait levé le stylet pour mettre fin à un trait. Pour filtrer l'encre à mesure que l’utilisateur la dessine, vous devez insérer le FilterPlugin avant le DynamicRenderer.

Le code C# suivant illustre une InkCanvas personnalisée qui filtre l'encre à mesure qu'elle est tracé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 classes StylusPlugIn et en les insérant dans des collections StylusPlugInCollection, vous pouvez considérablement améliorer le comportement de votre encre numérique. Vous avez accès aux données StylusPoint à mesure qu’elles sont générées, ce qui vous donne la possibilité de personnaliser l’entrée Stylus. Étant donné que vous avez un accès de bas niveau aux données StylusPoint, vous pouvez implémenter la collecte d'encre et le rendu avec des performances optimales pour votre application.

Voir aussi