Intercettazione dell'input dello stilo
L'architettura System.Windows.Input.StylusPlugIns fornisce un meccanismo per l'implementazione del controllo di basso livello sull'input di Stylus e la creazione di oggetti Stroke di input penna. La classe StylusPlugIn fornisce un meccanismo per implementare il comportamento personalizzato e applicarlo al flusso di dati provenienti dal dispositivo stilo per prestazioni ottimali.
In questo argomento sono contenute le seguenti sottosezioni:
Architettura
Implementazione dei plug-in dello stilo
Aggiunta del plug-in a un InkCanvas
Conclusione
Architettura
La classe StylusPlugIn rappresenta l'evoluzione delle API StylusInput, descritte nel documento Accesso e modifica dell'input penna, in Microsoft Windows XP Tablet PC Edition Software Development Kit 1.7
Ogni oggetto UIElement include una proprietà StylusPlugIns che corrisponde a un oggetto StylusPlugInCollection. È possibile aggiungere un oggetto StylusPlugIn alla proprietà StylusPlugIns di un elemento per modificare i dati di StylusPoint al momento della generazione. I dati di StylusPoint sono costituiti da tutte le proprietà supportate dal digitalizzatore del sistema, inclusi i dati dei punti X e Y e i dati PressureFactor.
Gli oggetti StylusPlugIn vengono inseriti direttamente nel flusso di dati provenienti dal dispositivo Stylus quando si aggiunge l'oggetto StylusPlugIn alla proprietà StylusPlugIns. L'ordine in cui i plug-in vengono aggiunti all'insieme StylusPlugIns definisce l'ordine in cui riceveranno i dati StylusPoint. Ad esempio, se si aggiunge un plug-in di filtro che restringe l'input ad una particolare area e quindi si aggiunge un plug-in che riconosce i movimenti quando vengono scritti, tale plug-in riceverà dati StylusPoint filtrati.
Implementazione dei plug-in dello stilo
Per implementare un plug-in, derivare una classe da StylusPlugIn. Questa classe viene applicata al flusso di dati provenienti dall'oggetto Stylus. In questa classe è possibile modificare i valori dei dati StylusPoint.
![]() |
---|
Se una classe StylusPlugIn genera o causa un'eccezione, l'applicazione verrà chiusa.È necessario svolgere test accurati sui controlli che utilizzano un oggetto StylusPlugIn e utilizzare un controllo solo se si è certi che l'oggetto StylusPlugIn non genererà un'eccezione. |
Nell'esempio seguente viene illustrato un plug-in che restringe l'input dello stilo modificando i valori X e Y nei dati StylusPoint provenienti dal dispositivo 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);
}
}
Aggiunta del plug-in a un InkCanvas
Il modo più semplice per utilizzare il plug-in personalizzato consiste nell'implementare una classe che deriva da InkCanvas e aggiungerla alla proprietà StylusPlugIns.
Nell'esempio seguente viene illustrato un oggetto InkCanvas personalizzato che filtra l'input penna.
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);
}
}
Se si aggiunge un oggetto FilterInkCanvas all'applicazione e la si esegue, si noterà che l'input penna viene limitato a un'area solo dopo che l'utente completa un tratto. Ciò è dovuto al fatto che l'oggetto InkCanvas include una proprietà DynamicRenderer che corrisponde a un oggetto StylusPlugIn ed è già un membro dell'insieme StylusPlugIns. L'oggetto StylusPlugIn personalizzato aggiunto all'insieme StylusPlugIns riceve i dati StylusPoint dopo che DynamicRenderer riceve dati. Di conseguenza, i dati StylusPoint verranno filtrati solo dopo che l'utente solleva la penna per terminare un tratto. Per filtrare l'input penna via via che viene tracciato dall'utente, è necessario inserire l'oggetto FilterPlugin prima dell'oggetto DynamicRenderer.
Nel codice C# seguente viene illustrato un oggetto InkCanvas personalizzato che filtra l'input penna via via che viene tracciato.
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);
}
}
Conclusione
Derivando le classi StylusPlugIn e inserendole negli insiemi StylusPlugInCollection, è possibile migliorare notevolmente il comportamento dell'input penna. Ottenendo l'accesso ai dati StylusPoint mentre vengono generati, è possibile personalizzare l'input Stylus. Grazie all'accesso di basso livello ai dati StylusPoint, è possibile implementare la raccolta e il rendering dell'input penna con prestazioni ottimali per l'applicazione.