Interception d'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 et 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

Il StylusPlugIn s’agit de l’évolution des API StylusInput , décrites dans Accès et manipulation d’entrée de 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. StylusPoint les données se composent de toutes les propriétés prises en charge par le numériseur système, y compris les données et les XY données de point, ainsi que PressureFactor les données.

Vos StylusPlugIn objets sont insérés directement dans le flux de données provenant de l’appareil Stylus lorsque vous ajoutez la StylusPlugInStylusPlugIns propriété. 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 o le flux de données tel qu’il provient du Stylus. Dans cette classe, vous pouvez modifier les valeurs des StylusPoint données.

Attention

Si une StylusPlugIn exception est levée ou provoque une exception, l’application se ferme. Vous devez tester soigneusement les contrôles qui consomment un StylusPlugIn contrôle et n’utilisent qu’un contrôle si vous êtes certain que l’exception 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 et les X valeurs des StylusPoint données à mesure qu’elles proviennent de l’appareilStylus.Y

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 une personnalisation InkCanvas qui filtre l’entrée manuscrite.

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

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

Si vous ajoutez une FilterInkCanvas application et que vous l’exécutez, vous remarquerez que l’entrée manuscrite n’est pas limitée à une région tant que l’utilisateur n’a pas terminé un trait. Cela est dû au fait que la InkCanvas propriété a une DynamicRenderer propriété, qui est déjà StylusPlugIn membre de la StylusPlugIns collection. Le personnalisé que StylusPlugIn vous avez ajouté à la StylusPlugIns collection reçoit les StylusPoint données après DynamicRenderer avoir 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’entrée manuscrite à mesure que l’utilisateur l’dessine, vous devez insérer l’entrée FilterPlugin avant .DynamicRenderer

Le code C# suivant illustre un code personnalisé InkCanvas qui filtre l’entrée manuscrite au fur et à mesure 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 des 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 collection d’entrées manuscrites et le StylusPoint rendu avec des performances optimales pour votre application.

Voir aussi