Freigeben über


Abfangen von Tablettstifteingaben

Die System.Windows.Input.StylusPlugIns-Architektur stellt einen Mechanismus zum Implementieren einer Low-Level-Steuerung von Stylus-Eingaben und zum Erstellen von Stroke -Objekten für die digitale Freihandeingabe bereit. Die StylusPlugIn-Klasse stellt Ihnen einen Mechanismus zur Verfügung, um benutzerdefiniertes Verhalten zu implementieren und dieses für eine optimale Leistung auf den vom Tablettstift eingehenden Datenstrom anzuwenden.

Dieses Thema enthält folgende Unterabschnitte:

  • Architektur

  • Implementieren von Tablettstift-Plug-Ins

  • Hinzufügen eines Plug-Ins zu einem InkCanvas

  • Schlussfolgerung

Architektur

StylusPlugIn ist die Weiterentwicklung der StylusInput-APIs, erläutert in Accessing and Manipulating Pen Input im Microsoft Windows XP Tablet PC Edition Software Development Kit 1.7.

Jedes UIElement verfügt über eine StylusPlugIns-Eigenschaft, die eine StylusPlugInCollection ist. Sie können ein StylusPlugIn zur StylusPlugIns-Eigenschaft eines Elements hinzufügen, um die StylusPoint-Daten beim Erzeugen zu bearbeiten. StylusPoint-Daten enthalten alle Eigenschaften, die vom Systemdigitalisierungsgerät unterstützt werden, einschließlich der Punktdaten X und Y sowie der PressureFactor-Daten.

Die StylusPlugIn-Objekte werden direkt in den vom Stylus-Gerät eingehenden Datenstrom eingefügt, wenn Sie StylusPlugIn zur StylusPlugIns-Eigenschaft hinzufügen. Die Reihenfolge, in der Plug-Ins zur StylusPlugIns-Auflistung hinzugefügt werden, entscheidet über die Reihenfolge, in der sie StylusPoint-Daten empfangen. Wenn Sie beispielsweise ein Filter-Plug-In hinzufügen, das die Eingabe auf einen bestimmten Bereich einschränkt, und anschließend ein Plug-In hinzufügen, das Stiftbewegungen beim Schreiben erkennt, wird das zweite Plug-In gefilterte StylusPoint-Daten empfangen.

Implementieren von Tablettstift-Plug-Ins

Leiten Sie eine Klasse von StylusPlugIn ab, um ein Plug-In zu implementieren. Diese Klasse wird auf den Datenstrom angewendet, während dieser von Stylus bereitgestellt wird. In dieser Klasse können Sie die Werte der StylusPoint-Daten ändern.

WarnhinweisVorsicht

Wenn ein StylusPlugIn eine Ausnahme auslöst oder verursacht, wird die Anwendung beendet.Sie sollten Steuerelemente gründlich testen, die StylusPlugIn verwenden, und ein Steuerelement nur dann verwenden, wenn Sie sicher sind, dass StylusPlugIn keine Ausnahme auslösen wird.

Im folgenden Beispiel wird ein Plug-In dargestellt, das die Tablettstifteingabe einschränkt, indem die Werte für X und Y in den StylusPoint Daten geändert werden, während sie vom Stylus-Gerät bereitgestellt werden.

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);
    }
}

Hinzufügen eines Plug-Ins zu einem InkCanvas

Die einfachste Möglichkeit zum Verwenden benutzerdefinierter Plug-Ins besteht im Implementieren einer von InkCanvas abgeleiteten Klasse und dem Hinzufügen zur StylusPlugIns-Eigenschaft.

Im folgenden Beispiel wird eine benutzerdefinierte InkCanvas-Klasse zum Filtern von Freihandeingaben dargestellt.

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);
    }
}

Wenn Sie ein FilterInkCanvas Ihrer Anwendung hinzufügen und diese ausführen, werden Sie feststellen, dass die Freihandeingaben nicht auf einen Bereich eingeschränkt werden, bevor der Benutzer einen Strich abgeschlossen hat. Dies geschieht, weil InkCanvas über eine DynamicRenderer-Eigenschaft verfügt, bei der es sich um ein StylusPlugIn handelt, das bereits ein Member der StylusPlugIns-Auflistung ist. Das benutzerdefinierte StylusPlugIn, das Sie der StylusPlugIns-Auflistung hinzugefügt haben, empfängt die StylusPoint-Daten, nachdem DynamicRenderer Daten empfangen hat. Daraus folgt, dass die StylusPoint-Daten nicht gefiltert werden, bevor der Benutzer den Stift anhebt, um einen Strich abzuschließen. Um die Freihandeingabe bereits während des Zeichnens durch den Benutzer zu filtern, müssen Sie das FilterPlugin vor dem DynamicRenderer einfügen.

Im folgenden C#-Code wird eine benutzerdefinierte InkCanvas-Klasse dargestellt, die die Freihandeingabe während des Zeichnens filtert.

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);

    }

}

Schlussfolgerung

Durch Ableiten Ihrer eigenen StylusPlugIn-Klassen und deren Einfügen in StylusPlugInCollection-Auflistungen können Sie das Verhalten von digitalen Freihandeingaben wesentlich erweitern. Sie können bereits bei der Erstellung auf die StylusPoint-Daten zugreifen und daher die Stylus-Eingabe anpassen. Durch diesen Low-Level-Zugriff auf die StylusPoint-Daten können Sie das Erfassen und Rendern von Freihandeingaben mit optimaler Leistung für Ihre Anwendung implementieren.

Siehe auch

Weitere Ressourcen

Erweiterte Behandlung von Freihandeingaben

Zugriff auf Stifteingaben und Bearbeiten von Stifteingaben