Partilhar via


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.

Consulte também

Outros recursos

Advanced Ink Handling

Acessando e manipulando Entrada de Caneta