Ekran Kaleminden Gelen Girişi Önleme
Mimari, System.Windows.Input.StylusPlugIns giriş ve dijital mürekkep Stroke nesnelerinin oluşturulması üzerinde Stylus düşük düzeyli denetim uygulamaya yönelik bir mekanizma sağlar. sınıfı, StylusPlugIn en iyi performans için özel davranış uygulamanız ve ekran kalemi cihazından gelen veri akışına uygulamanız için bir mekanizma sağlar.
Bu konu aşağıdaki alt bölümler içerir:
Mimari
StylusPlugIn, Kalem Girişlerine Erişme ve Bunları İşleme bölümünde açıklanan StylusInput API'lerinin evrimidir.
Her UIElement birinin bir StylusPlugIns özelliği vardır StylusPlugInCollection. Oluşturulan verileri işlemek StylusPoint için öğenin StylusPlugIns özelliğine bir StylusPlugIn ekleyebilirsiniz. StylusPointveriler, ve Y noktası verilerinin yanı sıra PressureFactor veriler de dahil olmak üzere sistem dijitalleştiricisi X tarafından desteklenen tüm özelliklerden oluşur.
nesnelerinizStylusPlugIn, özelliğine eklediğinizde doğrudan cihazdan Stylus gelen veri akışına StylusPlugIns eklenirStylusPlugIn. Eklentilerin koleksiyona StylusPlugIns eklenme sırası, verilerin hangi sırayla alınacağını StylusPoint belirler. Örneğin, girişi belirli bir bölgeyle kısıtlayan bir filtre eklentisi eklerseniz ve sonra da yazıldıklarında hareketleri tanıyan bir eklenti eklerseniz, hareketleri tanıyan eklenti filtrelenmiş StylusPoint veriler alır.
Ekran Kalemi Eklentilerini Uygulama
Eklenti uygulamak için öğesinden StylusPlugInbir sınıf türetin. Bu sınıf, içinden gelen veri akışına Stylusuygulanır. Bu sınıfta verilerin değerlerini StylusPoint değiştirebilirsiniz.
Dikkat
Bir StylusPlugIn özel durum oluşturur veya neden olursa, uygulama kapanır. bir kullanan StylusPlugIn ve yalnızca özel durum oluşturmayacağı konusunda eminseniz StylusPlugIn bir denetim kullanan denetimleri kapsamlı bir şekilde test etmelisiniz.
Aşağıdaki örnekte, cihazdan gelen Stylus verilerdeki ve Y değerlerini StylusPoint değiştirerek X ekran kalemi girişini kısıtlayan bir eklenti gösterilmektedir.
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
Eklentinizi InkCanvas'a Ekleme
Özel eklentinizi kullanmanın en kolay yolu, InkCanvas'tan türetilen bir sınıf uygulamak ve bunu özelliğine StylusPlugIns eklemektir.
Aşağıdaki örnekte, mürekkep filtreleyen bir özel InkCanvas öğe gösterilmektedir.
public class FilterInkCanvas : InkCanvas
{
FilterPlugin filter = new FilterPlugin();
public FilterInkCanvas()
: base()
{
this.StylusPlugIns.Add(filter);
}
}
Uygulamanıza bir FilterInkCanvas
ekler ve çalıştırırsanız, kullanıcı bir vuruşu tamamlayana kadar mürekkeple bir bölge arasında kısıtlama olmadığını fark edeceksiniz. Bunun nedeni InkCanvas , StylusPlugIn ve zaten koleksiyonun bir üyesi olan bir özelliğine StylusPlugIns sahip DynamicRenderer olmasıdır. Koleksiyona eklediğiniz özelStylusPlugIn, verileri aldıktan StylusPoint sonra DynamicRenderer alır.StylusPlugIns Sonuç olarak, kullanıcı bir vuruşu StylusPoint sonlandırmak için kalemi kaldırana kadar veriler filtrelenmez. Kullanıcı çizerken mürekkep filtrelemek için önce öğesini FilterPlugin
DynamicRenderereklemeniz gerekir.
Aşağıdaki C# kodu, mürekkep çizilirken filtreleyen özel InkCanvas bir kod gösterir.
public class DynamicallyFilteredInkCanvas : InkCanvas
{
FilterPlugin filter = new FilterPlugin();
public DynamicallyFilteredInkCanvas()
: base()
{
int dynamicRenderIndex =
this.StylusPlugIns.IndexOf(this.DynamicRenderer);
this.StylusPlugIns.Insert(dynamicRenderIndex, filter);
}
}
Sonuç
Kendi StylusPlugIn sınıflarınızı türeterek ve koleksiyonlara StylusPlugInCollection ekleyerek dijital mürekkeplerinizin davranışını büyük ölçüde geliştirebilirsiniz. Oluşturulan verilere erişiminiz StylusPoint vardır ve bu da size girişi özelleştirme Stylus fırsatı verir. Verilere bu kadar düşük düzeyde erişiminiz StylusPoint olduğundan, uygulamanız için en iyi performansla mürekkep toplama ve işleme uygulayabilirsiniz.
Ayrıca bkz.
.NET Desktop feedback