Interceptação de entrada a partir do Stylus
A arquitetura System.Windows.Input.StylusPlugIns fornece um mecanismo para a implementação de controle de baixo nível sobre entrada e a criação de Stylus de objetos Stroke de tinta digital. A classe StylusPlugIn fornece um mecanismo para que você possa implementar comportamento personalizado e aplicá-lo ao fluxo de dados provenientes do dispositivo de estilo para o desempenho ótimo.
Este tópico contém as subseções a seguir:
Architecture
Implementing StylusPlugins
Adding Your Plugin to an InkCanvas
Conclusion
Arquitetura
The StylusPlugIn é a evolução das StylusInput APIs, descritas em Acessando e manipulando a entrada à caneta, in the Microsoft Windows XP Tablet PC edição Software Development Kit 1.7.
Cada UIElement possui uma propriedade StylusPlugIns que é um StylusPlugInCollection. Você pode adicionar um StylusPlugIn um elemento StylusPlugIns propriedade manipular StylusPoint dados sistema autônomo ele são gerados. StylusPoint dados consistem em todas sistema autônomo propriedades com suporte do digitalizador de sistema, incluindo o X e Y ponto de dados, bem sistema autônomo PressureFactor dados.
Os objetos StylusPlugIn são inseridos diretamente no fluxo de dados provenientes do dispositivo Stylus quando você adiciona a StylusPlugIn à propriedade StylusPlugIns. A ordem na qual os plug-ins são adicionados à coleção StylusPlugIns determina a ordem na qual eles irão receber dados de StylusPoint . Por exemplo, se você adicionar um plug-in de filtro que restringe a entrada para uma região específica e em seguida, adicionar um plug-in que reconhece gestos como eles são gravados, o plug-in que reconhece gestos receberá os dados filtrados de StylusPoint.
Implementando Plug-ins de Estilo
Para implementar um plug-in, derive uma classe de StylusPlugIn. Essa classe é aplicada ao fluxo de dados na medida que chega de Stylus. Nesta classe você pode modificar os valores dos dados de StylusPoint.
Aviso
Se um StylusPlugIn lança ou causar uma exceção, o aplicativo será fechado. Você deve testar exaustivamente controles que consomem uma StylusPlugIn e usar somente um controle se tiver certeza que de StylusPlugIn não irá acionar uma exceção.
O exemplo a seguir demonstra um plug-in que restringe a entrada do estilo, modificando os valores X e Y nos dados de StylusPoint conforme eles chegam provenientes do 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);
}
}
Adicionando seu plug-in a um InkCanvas
A maneira mais fácil de usar o seu plug-in personalizado é implementar uma classe que deriva de InkCanvas e adicioná-la para a propriedade StylusPlugIns.
O exemplo a seguir demonstra um InkCanvas personalizado que filtra a tinta.
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 você adicionar um FilterInkCanvas a seu aplicativo e executá-lo, você observará que a tinta não está restrita a uma região até após o usuário concluir um traço. Isso acontece porque o InkCanvas tem uma propriedade DynamicRenderer, que é um StylusPlugIn e já é um membro da coleção StylusPlugIns. O StylusPlugIn personalizado que você adicionou à coleção StylusPlugIns, recebe os dados de StylusPoint após DynamicRenderer receber dados. Como resultado, os dados StylusPoint não serão filtrados até depois de o usuário levantar a caneta para finalizar um traço. Para filtrar a tinta na medida em que o usuário o desenha, você deve inserir o FilterPlugin antes de DynamicRenderer.
O seguinte código C# demonstra um InkCanvas personalizado que filtra a tinta como ela é desenhada.
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);
}
}
Conclusão
Ao obter seus próprias classes StylusPlugIn e inseri-las em coleções StylusPlugInCollection, você pode aprimorar bastante o comportamento de sua tinta digital. Você tem acesso aos dados de StylusPoint como ele é gerado, oferecendo a oportunidade para personalizar a entrada de Stylus. Como você tem tal acesso de baixo nível aos dados StylusPoint, você pode implementar coleção de tinta e renderizá-la com um desempenho otimizado para o seu aplicativo.