Sdílet prostřednictvím


Přijetí vstupu z pera

Architektura System.Windows.Input.StylusPlugIns poskytuje mechanismus pro implementaci kontroly Stylus nízké úrovně vstupu a vytváření digitálních objektů rukopisu Stroke . Třída StylusPlugIn poskytuje mechanismus pro implementaci vlastního chování a jeho použití na stream dat přicházejících ze zařízení pera pro optimální výkon.

Toto téma obsahuje následující pododdíly:

Architektura

Jedná se StylusPlugIn o vývoj rozhraní API StylusInput , která jsou popsaná v části Přístup a manipulace se vstupem pera.

Každý UIElementStylusPlugIns vlastnost, která je .StylusPlugInCollection Do vlastnosti elementu StylusPlugIns můžete přidat StylusPlugIn manipulaci s StylusPoint daty při jejich vygenerování. StylusPoint data se skládají ze všech vlastností podporovaných systémovou digitizátorem, včetně XY dat a dat bodů a PressureFactor dat.

Objekty StylusPlugIn se při přidání StylusPlugIn do StylusPlugIns vlastnosti vloží přímo do datového proudu dat přicházejících ze Stylus zařízení. Pořadí, ve kterém se moduly plug-in přidají do StylusPlugIns kolekce, určuje pořadí, ve kterém budou přijímat StylusPoint data. Pokud například přidáte modul plug-in filtru, který omezuje vstup do konkrétní oblasti, a pak přidáte modul plug-in, který rozpozná gesta při psaní, modul plug-in, který rozpozná gesta, obdrží filtrovaná StylusPoint data.

Implementace modulů plug-in Stylus

Chcete-li implementovat modul plug-in, odvození třídy z StylusPlugIn. Tato třída je použita o datový proud, protože pochází z Stylus. V této třídě můžete upravit hodnoty StylusPoint dat.

Upozornění

Pokud vyvolá StylusPlugIn výjimku nebo způsobí výjimku, aplikace se zavře. Měli byste důkladně otestovat ovládací prvky, které spotřebovávají StylusPlugIn ovládací prvek, a použít ho pouze v případě, že jste si jistí, že StylusPlugIn nevyvolá výjimku.

Následující příklad ukazuje modul plug-in, který omezuje vstup pera úpravou X a Y hodnotami v StylusPoint datech, jak pocházejí ze Stylus zařízení.

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

Přidání modulu plug-in do inkCanvas

Nejjednodušší způsob, jak použít vlastní modul plug-in, je implementovat třídu odvozenou z InkCanvas a přidat ji do StylusPlugIns vlastnosti.

Následující příklad ukazuje vlastní InkCanvas , který filtruje rukopis.

public class FilterInkCanvas : InkCanvas
{
    FilterPlugin filter = new FilterPlugin();

    public FilterInkCanvas()
        : base()
    {
        this.StylusPlugIns.Add(filter);
    }
}

Pokud do aplikace přidáte FilterInkCanvas a spustíte ji, všimnete si, že rukopis není omezen na oblast, dokud uživatel nedokončí tah. Důvodem je to, že InkCanvasDynamicRenderer vlastnost, která je a StylusPlugIn je již členem StylusPlugIns kolekce. Vlastní, StylusPlugIn který jste přidali do StylusPlugIns kolekce, obdrží StylusPoint data po DynamicRenderer přijetí dat. V důsledku toho nebudou StylusPoint data filtrována, dokud uživatel neodvolá pero, aby ukončil tah. Chcete-li vyfiltrovat rukopis, jak ho uživatel nakreslí, je nutné vložit FilterPlugin před .DynamicRenderer

Následující kód jazyka C# ukazuje vlastní InkCanvas , který filtruje rukopis při jeho vykreslení.

public class DynamicallyFilteredInkCanvas : InkCanvas
{
    FilterPlugin filter = new FilterPlugin();

    public DynamicallyFilteredInkCanvas()
        : base()
    {
        int dynamicRenderIndex =
            this.StylusPlugIns.IndexOf(this.DynamicRenderer);

        this.StylusPlugIns.Insert(dynamicRenderIndex, filter);
    }
}

Závěr

Odvozováním vlastních StylusPlugIn tříd a jejich vložením do StylusPlugInCollection kolekcí můžete výrazně vylepšit chování digitálního rukopisu. Máte přístup k datům StylusPoint , která se generují, a dáváte tak možnost přizpůsobit Stylus vstup. Vzhledem k tomu, že máte takový přístup na nízké úrovni k StylusPoint datům, můžete implementovat shromažďování rukopisu a vykreslování s optimálním výkonem pro vaši aplikaci.

Viz také