Interception de l’entrée à partir du stylet
L'architecture System.Windows.Input.StylusPlugIns fournit un mécanisme permettant d'implémenter un contrôle granulaire sur l'entrée de données Stylus et la création d'objets d'encre numérique Stroke. La classe StylusPlugIn fournit un mécanisme permettant d’implémenter un comportement personnalisé et de l’appliquer au flux de données provenant de l’appareil de stylet pour obtenir des performances optimales.
Cette rubrique contient les sous-sections suivantes :
Architecture
Le StylusPlugIn est l’évolution des StylusInput API, décrites dans Accès et manipulation de l'entrée de stylet.
Chaque UIElement possède une propriété StylusPlugIns qui est un(e) StylusPlugInCollection. Vous pouvez ajouter une StylusPlugIn à la propriété StylusPlugIns d’un élément pour manipuler des données StylusPoint à mesure qu’elles sont générées. Les données StylusPoint se composent de toutes les propriétés prises en charge par le numériseur système, y compris les données de points X et Y, ainsi que les données de PressureFactor.
Vos objets StylusPlugIn sont insérés directement dans le flux de données provenant de l’appareil 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 des données StylusPoint. Par exemple, si vous ajoutez un plug-in de filtre qui limite l’entrée à une région particulière, puis ajoutez un plug-in qui reconnaît les mouvements tels qu’ils sont écrits, le plug-in qui reconnaît les mouvements reçoit des données filtrées StylusPoint.
Implémentation des plug-ins Stylus
Pour implémenter un plug-in, dérivez une classe de StylusPlugIn. Cette classe est appliquée au flux de données au fur et à mesure qu'il provient du Stylus. Dans cette classe, vous pouvez modifier les valeurs des données StylusPoint.
Prudence
Si une StylusPlugIn lève ou provoque une exception, l’application se ferme. Vous devez tester soigneusement les contrôles qui consomment un StylusPlugIn et n'utiliser un contrôle que si vous êtes certain que le StylusPlugIn ne génère pas d'exception.
L’exemple suivant illustre un plug-in qui limite l’entrée de stylet en modifiant les valeurs de X et de Y dans les données StylusPoint telles qu’elles proviennent de l’appareil Stylus.
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
Ajout de votre plug-in à un InkCanvas
Le moyen le plus simple d’utiliser votre plug-in personnalisé consiste à implémenter une classe dérivée d’InkCanvas et à l’ajouter à la propriété StylusPlugIns.
L’exemple suivant démontre une InkCanvas personnalisée qui filtre l’encre.
public class FilterInkCanvas : InkCanvas
{
FilterPlugin filter = new FilterPlugin();
public FilterInkCanvas()
: base()
{
this.StylusPlugIns.Add(filter);
}
}
Si vous ajoutez une FilterInkCanvas
à votre application et que vous l’exécutez, vous remarquerez que l'encre n’est pas limitée à une région tant que l’utilisateur n’a pas terminé un trait. Ceci est dû au fait que le 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 jusqu'à ce que l'utilisateur ait levé le stylet pour mettre fin à un trait. Pour filtrer l'encre à mesure que l’utilisateur la dessine, vous devez insérer le FilterPlugin
avant le DynamicRenderer.
Le code C# suivant illustre une InkCanvas personnalisée qui filtre l'encre à mesure qu'elle est tracée.
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 considérablement améliorer le comportement de votre encre numérique. Vous avez accès aux données StylusPoint à mesure qu’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 d'encre et le rendu avec des performances optimales pour votre application.
Voir aussi
.NET Desktop feedback