Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A arquitetura System.Windows.Input.StylusPlugIns fornece um mecanismo para implementar controle de baixo nível sobre a entrada Stylus e a criação de objetos digitais de tinta Stroke. A StylusPlugIn classe fornece um mecanismo para implementar o comportamento personalizado e aplicá-lo ao fluxo de dados provenientes do dispositivo stylus para o desempenho ideal.
Este tópico contém as seguintes subseções:
Arquitetura
A StylusPlugIn é a evolução das APIs StylusInput, descritas em Acessando e Manipulando Entrada de Caneta.
Cada UIElement tem uma propriedade StylusPlugIns que é um StylusPlugInCollection. Você pode adicionar um StylusPlugIn à propriedade StylusPlugIns de um elemento para manipular dados StylusPoint conforme eles são gerados. StylusPoint os dados consistem em todas as propriedades compatíveis com o digitalizador do sistema, incluindo os dados de ponto X e Y, assim como os dados PressureFactor.
Seus objetos StylusPlugIn são inseridos diretamente no fluxo de dados provenientes do dispositivo Stylus quando você adiciona StylusPlugIn à propriedade StylusPlugIns. A ordem na qual os plug-ins são adicionados à StylusPlugIns coleção determina a ordem na qual eles receberão StylusPoint dados. Por exemplo, se você adicionar um plug-in de filtro que restringe a entrada a uma determinada região e, em seguida, adicionar um plug-in que reconhece gestos conforme eles são gravados, o plug-in que reconhece gestos receberá dados filtrados StylusPoint .
Implementando plug-ins Stylus
Para implementar um plug-in, derive uma classe de StylusPlugIn. Essa classe é aplicada ao fluxo de dados conforme ele vem da Stylus. Nesta classe, você pode modificar os valores dos StylusPoint dados.
Cuidado
Se um StylusPlugIn lançar ou causar uma exceção, o aplicativo será fechado. Você deve testar detalhadamente os controles que consomem um StylusPlugIn, e usar apenas um controle se tiver certeza de que StylusPlugIn não gerará uma exceção.
O exemplo a seguir demonstra um plug-in que restringe a entrada de caneta ao modificar os valores X e Y nos dados StylusPoint conforme eles vêm do dispositivo 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
Adicionando seu plugin a um InkCanvas
A maneira mais fácil de usar seu plug-in personalizado é implementar uma classe que deriva do InkCanvas e adicioná-la à StylusPlugIns propriedade.
O exemplo a seguir demonstra um personalizado InkCanvas que filtra a tinta.
public class FilterInkCanvas : InkCanvas
{
FilterPlugin filter = new FilterPlugin();
public FilterInkCanvas()
: base()
{
this.StylusPlugIns.Add(filter);
}
}
Se você adicionar um FilterInkCanvas
ao seu aplicativo e executá-lo, observará que a tinta não se restringe a uma região até que o usuário conclua um traço.
InkCanvas tem uma propriedade DynamicRenderer, que é um StylusPlugIn e já faz parte da coleção StylusPlugIns. O personalizado StylusPlugIn que você adicionou à StylusPlugIns coleção recebe os StylusPoint dados após DynamicRenderer receber dados. Como resultado, os dados StylusPoint não serão filtrados até que o usuário tire a caneta para encerrar um traço. Para filtrar a tinta à medida que o usuário a desenha, você deve inserir o FilterPlugin
antes do DynamicRenderer.
O código C# a seguir demonstra um personalizado InkCanvas que filtra a tinta conforme ela é desenhada.
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 derivar suas próprias classes StylusPlugIn e inseri-las nas coleções StylusPlugInCollection, você pode melhorar significativamente o comportamento da tinta digital. Você tem acesso aos StylusPoint dados à medida que são gerados, o que lhe dá a oportunidade de personalizar a Stylus entrada. Como você tem um baixo nível de acesso aos dados StylusPoint, você pode implementar a coleta e a renderização de tinta com o desempenho ideal para seu aplicativo.
Consulte também
.NET Desktop feedback