Bagikan melalui


Mencegat Input dari Stylus

Arsitektur ini System.Windows.Input.StylusPlugIns menyediakan mekanisme untuk menerapkan kontrol tingkat rendah atas Stylus input dan pembuatan objek tinta Stroke digital. Kelas ini StylusPlugIn menyediakan mekanisme bagi Anda untuk menerapkan perilaku kustom dan menerapkannya ke aliran data yang berasal dari perangkat stylus untuk performa optimal.

Topik ini berisi sub bagian berikut:

Arsitektur

StylusPlugIn adalah evolusi API StylusInput, yang dijelaskan dalam Mengakses dan Memanipulasi Input Pena.

Masing-masing UIElement memiliki StylusPlugIns properti yang merupakan StylusPlugInCollection. Anda dapat menambahkan StylusPlugIn ke properti elemen StylusPlugIns untuk memanipulasi StylusPoint data saat dibuat. StylusPoint data terdiri dari semua properti yang didukung oleh digitizer sistem, termasuk X data titik dan Y , serta PressureFactor data.

Objek Anda StylusPlugIn disisipkan langsung ke aliran data yang Stylus berasal dari perangkat saat Anda menambahkannya StylusPlugIn ke StylusPlugIns properti . Urutan di mana plug-in ditambahkan ke StylusPlugIns koleksi menentukan urutan di mana mereka akan menerima StylusPoint data. Misalnya, jika Anda menambahkan plug-in filter yang membatasi input ke wilayah tertentu, lalu menambahkan plug-in yang mengenali gerakan saat ditulis, plug-in yang mengenali gerakan akan menerima data yang StylusPoint difilter.

Menerapkan Plug-in Stylus

Untuk menerapkan plug-in, dapatkan kelas dari StylusPlugIn. Kelas ini diterapkan o aliran data saat masuk dari Stylus. Di kelas ini Anda dapat memodifikasi nilai StylusPoint data.

Perhatian

Jika melempar StylusPlugIn atau menyebabkan pengecualian, aplikasi akan ditutup. Anda harus menguji kontrol secara menyeluruh yang mengonsumsi StylusPlugIn dan hanya menggunakan kontrol jika Anda yakin StylusPlugIn tidak akan melemparkan pengecualian.

Contoh berikut menunjukkan plug-in yang membatasi input stylus dengan memodifikasi X nilai dan Y dalam StylusPoint data saat masuk dari Stylus perangkat.

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

Menambahkan Plug-in Anda ke InkCanvas

Cara term mudah untuk menggunakan plug-in kustom Anda adalah dengan mengimplementasikan kelas yang berasal dari InkCanvas dan menambahkannya ke StylusPlugIns properti .

Contoh berikut menunjukkan kustom InkCanvas yang memfilter tinta.

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

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

Jika Anda menambahkan FilterInkCanvas ke aplikasi dan menjalankannya, Anda akan melihat bahwa tinta tidak dibatasi ke wilayah sampai setelah pengguna menyelesaikan stroke. Ini karena InkCanvas memiliki DynamicRenderer properti, yang merupakan StylusPlugIn dan sudah menjadi anggota StylusPlugIns koleksi. Kustom StylusPlugIn yang Anda tambahkan ke StylusPlugIns koleksi menerima StylusPoint data setelah DynamicRenderer menerima data. Akibatnya, StylusPoint data tidak akan difilter sampai setelah pengguna mengangkat pena untuk mengakhiri goresan. Untuk memfilter tinta saat pengguna menggambarnya, Anda harus menyisipkan FilterPlugin sebelum DynamicRenderer.

Kode C# berikut menunjukkan kustom InkCanvas yang memfilter tinta saat digambar.

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

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

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

Kesimpulan

Dengan mengambil kelas Anda sendiri StylusPlugIn dan memasukkannya ke dalam StylusPlugInCollection koleksi, Anda dapat sangat meningkatkan perilaku tinta digital Anda. Anda memiliki akses ke StylusPoint data seperti yang dihasilkan, memberi Anda kesempatan untuk menyesuaikan Stylus input. Karena Anda memiliki akses tingkat rendah ke data, StylusPoint Anda dapat menerapkan pengumpulan dan penyajian tinta dengan performa optimal untuk aplikasi Anda.

Baca juga