Abfangen von Tablettstifteingaben

Die System.Windows.Input.StylusPlugIns-Architektur bietet einen Mechanismus zum Implementieren der Steuerung auf niedriger Ebene über Stylus-Eingaben und die Erstellung digitaler Freihand-Stroke-Objekte. Die StylusPlugIn-Klasse stellt Ihnen einen Mechanismus zur Verfügung, um benutzerdefiniertes Verhalten zu implementieren und dieses für eine optimale Leistung des im Eingabestift des Geräts eingehenden Datenstrom anzuwenden.

Dieses Thema enthält folgende Unterabschnitte:

Aufbau

Das StylusPlugIn ist die Entwicklung der StylusInput-APIs, die unter Zugreifen auf und Bearbeiten von Stifteingaben beschrieben sind.

Jedes UIElement hat eine StylusPlugIns-Eigenschaft, die eine StylusPlugInCollection ist. Sie können ein StylusPlugIn der StylusPlugIns-Eigenschaft eines Elements hinzufügen, um StylusPoint-Daten zu bearbeiten, während sie generiert werden. StylusPoint-Daten bestehen aus allen Eigenschaften, die vom Systemdigitalisierer unterstützt werden, einschließlich der X- und Y-Punktdaten sowie der PressureFactor-Daten.

Ihre StylusPlugIn-Objekte werden direkt in den Datenstrom eingefügt, der aus dem Stylus-Gerät stammt, wenn Sie StylusPlugIns die StylusPlugIn-Eigenschaft hinzufügen. Die Reihenfolge, in der Plug-Ins der StylusPlugIns-Sammlung hinzugefügt werden, diktiert die Reihenfolge, in der sie StylusPoint-Daten erhalten. Wenn Sie z. B. ein Filter-Plug-In hinzufügen, das Eingaben auf einen bestimmten Bereich beschränkt, und Sie dann ein Plug-In hinzufügen, das Gesten erkennt, während sie geschrieben werden, erhält das Plug-In, das Gesten erkennt, gefilterte StylusPoint-Daten.

Implementieren von Tablettstift-Plug-Ins

Um ein Plug-In zu implementieren, leiten Sie eine Klasse von StylusPlugIn ab. Diese Klasse wird auf den Datenstrom angewendet, wenn sie aus Stylus kommen. In dieser Klasse können Sie die Werte der StylusPoint-Daten ändern.

Achtung

Wenn StylusPlugIn eine Ausnahme auslöst oder verursacht, wird die Anwendung geschlossen. Sie sollten Steuerelemente sorgfältig testen, die ein StylusPlugIn nutzen und ein Steuerelement nur verwenden, wenn Sie sicher sind, dass StylusPlugIn keine Ausnahme auslöst.

Im folgenden Beispiel wird ein Plug-In veranschaulicht, das die Eingabe anhand des Eingabestifts einschränkt, indem die Werte X und Y in den StylusPoint-Daten geändert werden, da sie aus dem Stylus-Gerät stammen.

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

Hinzufügen Ihres Plug-Ins zu einem InkCanvas

Die einfachste Möglichkeit zum Verwenden Ihres benutzerdefinierten Plug-Ins besteht darin, eine Klasse zu implementieren, die von InkCanvas abgeleitet und der StylusPlugIns-Eigenschaft hinzugefügt wird.

Im folgenden Beispiel wird ein benutzerdefiniertes InkCanvas-Objekt veranschaulicht, das die Freihandeingabe filtert.

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

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

Wenn Sie Ihrer Anwendung eine FilterInkCanvas-App hinzufügen und ausführen, werden Sie feststellen, dass die Freihandeingabe auf einen Bereich beschränkt ist, bis der Benutzer einen Strich abgeschlossen hat. Dies liegt daran, dass InkCanvas eine DynamicRenderer-Eigenschaft hat, die ein StylusPlugIn und bereits Mitglied der StylusPlugIns-Auflistung ist. Das benutzerdefinierte StylusPlugIn, das Sie zur StylusPlugIns-Sammlung hinzugefügt haben, empfängt die StylusPoint-Daten, nachdem DynamicRenderer Daten empfängt. Dadurch werden die StylusPoint-Daten erst gefiltert, wenn der Benutzer den Stift anhebt, um einen Strich zu beenden. Um die Freihandeingabe zu filtern, während der Benutzer zeichnet, müssen Sie FilterPlugin vor DynamicRenderer einfügen.

Der folgende C#-Code veranschaulicht ein benutzerdefiniertes InkCanvas-Objekt, das die Freihandeingabe während des Zeichnens filtert.

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

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

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

Zusammenfassung

Indem Sie Ihre eigenen StylusPlugIn-Klassen ableiten und sie in StylusPlugInCollection-Sammlungen einfügen, können Sie das Verhalten Ihrer digitalen Freihandeingabe stark verbessern. Sie haben Zugriff auf die StylusPoint-Daten, während sie generiert werden. Dies bietet Ihnen die Möglichkeit, die Stylus-Eingabe anzupassen. Da Sie einen solchen niederschwelligen Zugriff auf die StylusPoint-Daten besitzen, können Sie die Freihandeingabesammlung implementieren und sie mit optimaler Leistung für Ihre Anwendung rendern.

Weitere Informationen