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
.NET Desktop feedback
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk