Aracılığıyla paylaş


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 FilterPluginDynamicRenderereklemeniz 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.