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 von Stroke-Freihandobjekten. Die StylusPlugIn-Klasse stellt einen Mechanismus bereit, mit dem Sie benutzerdefiniertes Verhalten implementieren und auf den Datenstrom anwenden können, der vom Eingabestiftgerät stammt, um eine optimale Leistung zu erzielen.
Dieses Thema enthält die folgenden Unterabschnitte:
Architektur
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 zur 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 StylusPlugIn zur StylusPlugIns-Eigenschaft hinzufügen. Die Reihenfolge, in der Plug-Ins zur StylusPlugIns-Sammlung hinzugefügt werden, bestimmt die Reihenfolge, in der sie StylusPoint-Daten empfangen. 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 StylusPlugInab. Diese Klasse wird auf den Datenstrom angewendet, wenn er aus Stylus kommt. In dieser Klasse können Sie die Werte der StylusPoint Daten ändern.
Vorsicht
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 InkCanvas
Die einfachste Möglichkeit, Ihr benutzerdefiniertes Plug-In zu verwenden, besteht darin, eine Klasse zu implementieren, die von InkCanvas abgeleitet ist 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);
}
}
Schlussfolgerung
Indem Sie Ihre eigenen StylusPlugIn-Klassen ableiten und sie in StylusPlugInCollection-Sammlungen einfügen, können Sie das Verhalten Ihrer 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 über einen so niedrigstufigen Zugriff auf die StylusPoint Daten verfügen, können Sie die Tintenaufnahme und das Rendering mit optimaler Leistung für Ihre Anwendung implementieren.
Weitere Informationen
.NET Desktop feedback