Abfangen von TablettstifteingabenIntercepting Input from the Stylus

Die System.Windows.Input.StylusPlugIns Architektur bietet einen Mechanismus zum Implementieren der Steuerung auf niedriger Ebene über Stylus sowie die Erstellung von digitaler Tinte Stroke Objekte.The System.Windows.Input.StylusPlugIns architecture provides a mechanism for implementing low-level control over Stylus input and the creation of digital ink Stroke objects. Die StylusPlugIn -Klasse bietet einen Mechanismus für die Sie benutzerdefiniertes Verhalten implementieren, und klicken Sie auf die vom Tablettstift für eine optimale Leistung eingehenden Datenstrom anzuwenden.The StylusPlugIn class provides a mechanism for you to implement custom behavior and apply it to the stream of data coming from the stylus device for the optimal performance.

Dieses Thema enthält folgende Unterabschnitte:This topic contains the following subsections:

ArchitekturArchitecture

Die StylusPlugIn ist die Weiterentwicklung von der StylusInput APIs, die in beschriebenen zugreifen auf und Bearbeiten von Stifteingabein die Microsoft Windows XP Tablet PC Edition-Software Development Kit 1.7.The StylusPlugIn is the evolution of the StylusInput APIs, described in Accessing and Manipulating Pen Input, in the Microsoft Windows XP Tablet PC Edition Software Development Kit 1.7.

Jede UIElement verfügt über eine StylusPlugIns -Eigenschaft, ist eine StylusPlugInCollection.Each UIElement has a StylusPlugIns property that is a StylusPlugInCollection. Hinzufügbaren eine StylusPlugIn auf ein Element des StylusPlugIns Eigenschaft bearbeiten StylusPoint Daten generiert werden.You can add a StylusPlugIn to an element's StylusPlugIns property to manipulate StylusPoint data as it is generated. StylusPoint Daten besteht aus den Eigenschaften, die für die vom System Digitizer, einschließlich unterstützt die X und Y zeigen Daten als auch PressureFactor Daten.StylusPoint data consists of all the properties supported by the system digitizer, including the X and Y point data, as well as PressureFactor data.

Ihre StylusPlugIn Objekte eingefügt werden, direkt in den Stream der Daten aus der Stylus Gerät beim Hinzufügen der StylusPlugIn auf die StylusPlugIns Eigenschaft.Your StylusPlugIn objects are inserted directly into the stream of data coming from the Stylus device when you add the StylusPlugIn to the StylusPlugIns property. Die Reihenfolge in der-Plug-ins, um hinzugefügt werden die StylusPlugIns Auflistung bestimmt die Reihenfolge, in dem sie erhalten StylusPoint Daten.The order in which plug-ins are added to the StylusPlugIns collection dictates the order in which they will receive StylusPoint data. Z. B. Wenn Sie fügen Sie einen Filter-Plug-Ins, die Eingabe für eine bestimmte Region beschränkt, und fügen Sie dann ein plug-in, das erkennt Bewegungen, wie sie geschrieben werden, das plug-in, das erkennt Bewegungen erhalten gefilterte StylusPoint Daten.For example, if you add a filter plug-in that restricts input to a particular region, and then add a plug-in that recognizes gestures as they are written, the plug-in that recognizes gestures will receive filtered StylusPoint data.

Implementieren der Tablettstift-Plug-insImplementing Stylus Plug-ins

Um ein plug-in zu implementieren, leiten Sie eine Klasse von StylusPlugIn.To implement a plug-in, derive a class from StylusPlugIn. Diese Klasse ist angewendeten o des Datenstroms, stammt von die Stylus.This class is applied o the stream of data as it comes in from the Stylus. In dieser Klasse können Sie ändern die Werte der StylusPoint Daten.In this class you can modify the values of the StylusPoint data.

Achtung

Wenn eine StylusPlugIn auslöst, oder löst eine Ausnahme, die Anwendung wird beendet.If a StylusPlugIn throws or causes an exception, the application will close. Steuerelemente, die nutzen, sollten gründlich getestet eine StylusPlugIn und nur ein Steuerelement verwenden, wenn Sie sicher sind die StylusPlugIn wird keine Ausnahme ausgelöst.You should thoroughly test controls that consume a StylusPlugIn and only use a control if you are certain the StylusPlugIn will not throw an exception.

Das folgende Beispiel zeigt ein plug-in, das schränkt die nastala chyba vstupu durch Ändern der X und Y Werte in der StylusPoint Daten stammen der Stylus Gerät.The following example demonstrates a plug-in that restricts the stylus input by modifying the X and Y values in the StylusPoint data as it comes in from the Stylus device.

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

Hinzufügen eines Plug-Ins an ein InkCanvas-SteuerelementAdding Your Plug-in to an InkCanvas

Die einfachste Möglichkeit zum Verwenden benutzerdefinierter-Plug-in wird zum Implementieren einer Klasse, die von InkCanvas-Steuerelement abgeleitet wird, und fügen sie der StylusPlugIns Eigenschaft.The easiest way to use your custom plug-in is to implement a class that derives from InkCanvas and add it to the StylusPlugIns property.

Das folgende Beispiel veranschaulicht eine benutzerdefinierte InkCanvas zum Filtern von Freihandeingaben.The following example demonstrates a custom InkCanvas that filters the ink.

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

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

Wenn Sie beim Hinzufügen einer FilterInkCanvas zu Ihrer Anwendung und führen Sie es, Sie werden feststellen, dass die Freihandeingaben beschränkt, in einer Region, bis der Benutzer einen Strich abgeschlossen hat.If you add a FilterInkCanvas to your application and run it, you will notice that the ink isn't restricted to a region until after the user completes a stroke. Grund hierfür ist, die InkCanvas verfügt über eine DynamicRenderer Eigenschaft, die eine StylusPlugIn und bereits ein Mitglied der StylusPlugIns Auflistung.This is because the InkCanvas has a DynamicRenderer property, which is a StylusPlugIn and is already a member of the StylusPlugIns collection. Die benutzerdefinierte StylusPlugIn Sie hinzugefügt haben, um die StylusPlugIns Sammlung erhält die StylusPoint Daten nach DynamicRenderer empfängt Daten.The custom StylusPlugIn you added to the StylusPlugIns collection receives the StylusPoint data after DynamicRenderer receives data. Daher die StylusPoint Daten nicht gefiltert werden, erst nach dem der Benutzer den Stift zum Beenden eines Strichs anhebt.As a result, the StylusPoint data will not be filtered until after the user lifts the pen to end a stroke. Um, wenn der Benutzer es zeichnet die Freihandeingabe zu filtern, müssen Sie das Einfügen der FilterPlugin vor der DynamicRenderer.To filter the ink as the user draws it, you must insert the FilterPlugin before the DynamicRenderer.

Der folgende C#-Code veranschaulicht eine benutzerdefinierte InkCanvas , filtert die Freihandeingabe, wie es gezeichnet wird.The following C# code demonstrates a custom InkCanvas that filters the ink as it is drawn.

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

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

    }

}

SchlussbemerkungConclusion

Durch Ableiten von Ihren eigenen StylusPlugIn Klassen und Einfügen in StylusPlugInCollection Auflistungen, Sie können das Verhalten von digitaler Tinte erheblich verbessern.By deriving your own StylusPlugIn classes and inserting them into StylusPlugInCollection collections, you can greatly enhance the behavior of your digital ink. Sie haben Zugriff auf die StylusPoint Daten generiert, haben Sie die Möglichkeit zum Anpassen der Stylus Eingabe.You have access to the StylusPoint data as it is generated, giving you the opportunity to customize the Stylus input. Da diesen Low-Level-Zugriff auf die StylusPoint Daten, Sie können die Freihandeingaben und das Rendering mit optimaler Leistung für Ihre Anwendung implementieren.Because you have such low-level access to the StylusPoint data, you can implement ink collection and rendering with optimal performance for your application.

Siehe auchSee also