Interception d'entrée à partir du stylet
Mise à jour : novembre 2007
L'architecture System.Windows.Input.StylusPlugIns fournit un mécanisme pour l'implémentation du contrôle de bas niveau sur l'entrée Stylus et la création d'objets Stroke à l'encre numérique. La classe StylusPlugIn fournit un mécanisme qui vous permet d'implémenter un comportement personnalisé et de l'appliquer au flux de données provenant du périphérique de stylet pour des performances optimales.
Cette rubrique contient les sous-sections suivantes :
Architecture
Implementing StylusPlugins
Adding Your Plugin to an InkCanvas
Conclusion
Architecture
StylusPlugIn est l'évolution des API StylusInput décrites dans Accessing and Manipulating Pen Input, dans Microsoft Windows XP Tablet PC Edition Software Development Kit 1.7.
Chaque UIElement a une propriété StylusPlugIns qui est un StylusPlugInCollection. Vous pouvez ajouter un StylusPlugIn à la propriété d'un élément StylusPlugIns pour manipuler les données StylusPoint quand elles sont générées. Les données StylusPoint sont composées de toutes les propriétés prises en charge par le digitaliseur de système, y compris les données de point X et Y, ainsi que les données PressureFactor.
Vos objets StylusPlugIn sont insérés directement dans le flux de données des données provenant du périphérique Stylus lorsque vous ajoutez le StylusPlugIn à la propriété StylusPlugIns. L'ordre dans lequel les plug-ins sont ajoutés à la collection StylusPlugIns détermine l'ordre dans lequel ils recevront les données StylusPoint. Par exemple, si vous ajoutez un plug-in de filtre qui restreint l'entrée à une région particulière et que vous ajoutez ensuite un plug-in qui reconnaît les gestes lors de leur écriture, le plug-in qui reconnaît les gestes recevra des données StylusPoint filtrées.
Implémentation de plug-ins de stylet
Pour implémenter un plug-in, dérivez une classe de StylusPlugIn. Cette classe est appliquée au flux de données lorsqu'il arrive du Stylus. Dans cette classe, vous pouvez modifier les valeurs des données StylusPoint.
Attention : |
---|
Si un StylusPlugIn lève ou provoque une exception, l'application se ferme. Vous devez tester entièrement les contrôles qui utilisent un StylusPlugIn. N'utilisez un contrôle que si vous êtes certain que le StylusPlugIn ne lèvera pas d'exception. |
L'exemple suivant montre un plug-in qui restreint l'entrée du stylet en modifiant les valeurs X et Y dans les données StylusPoint lorsqu'elles proviennent du périphérique Stylus.
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);
}
}
Ajout de votre plug-in à un InkCanvas
Le meilleur moyen d'utiliser votre plug-in personnalisé est d'implémenter une classe qui dérive d'InkCanvas et de l'ajouter à la propriété StylusPlugIns.
L'exemple suivant montre un InkCanvas personnalisé qui filtre l'encre.
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);
}
}
Si vous ajoutez un FilterInkCanvas à votre application et que vous l'exécutez, vous remarquerez que l'encre n'est pas restreinte à une région tant que l'utilisateur n'a pas terminé son trait. Cela est dû au fait qu'InkCanvas possède une propriété DynamicRenderer qui est un StylusPlugIn et est déjà membre de la collection StylusPlugIns. Le StylusPlugIn personnalisé que vous avez ajouté à la collection StylusPlugIns reçoit les données StylusPoint après que DynamicRenderer a reçu des données. Par conséquent, les données StylusPoint ne seront pas filtrées tant que l'utilisateur n'aura pas soulevé le stylet pour terminer son trait. Pour filtrer l'encre pendant que l'utilisateur dessine, vous devez insérer le FilterPlugin avant le DynamicRenderer.
Le code C# suivant montre un InkCanvas personnalisé qui filtre l'encre pendant la réalisation du dessin.
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);
}
}
Conclusion
En dérivant vos propres classes StylusPlugIn et en les insérant dans des collections StylusPlugInCollection, vous pouvez facilement améliorer le comportement de votre encre numérique. Vous avez accès aux données StylusPoint lorsqu'elles sont générées, ce qui vous donne la possibilité de personnaliser l'entrée Stylus. Étant donné que vous avez un accès de bas niveau aux données StylusPoint, vous pouvez implémenter la collecte et la restitution d'encre avec des performances optimales pour votre application.