Zachycování vstupu ze stylusu
Architektura System.Windows.Input.StylusPlugIns poskytuje mechanismus pro implementaci kontroly nízké úrovně nad vstupem Stylus a vytváření digitálních rukopisných Stroke objektů. Třída StylusPlugIn poskytuje mechanismus pro implementaci vlastního chování a jeho použití na datový proud přicházející ze zařízení pera pro optimální výkon.
Toto téma obsahuje následující pododdíly:
Přidání vašeho zásuvného modulu do InkCanvas
Architektura
StylusPlugIn je vývoj rozhraní API StylusInput, která jsou popsaná v tématu Přístup k peru a manipulace s nimi.
Každý UIElement má vlastnost StylusPlugIns, která je StylusPlugInCollection. Do vlastnosti StylusPlugIns elementu můžete přidat StylusPlugIn a manipulovat s StylusPoint daty při jejich generování. StylusPoint data se skládá ze všech vlastností podporovaných systémovým digitizérem, včetně X a Y bodových údajů a také PressureFactor dat.
Objekty StylusPlugIn jsou při přidání StylusPlugIn do vlastnosti StylusPlugIns vloženy přímo do datového proudu přicházejícího ze zařízení Stylus. Pořadí, ve kterém se pluginy přidají do kolekce StylusPlugIns, určuje pořadí, ve kterém budou přijímat data StylusPoint. Pokud například přidáte filtr, který omezuje vstup do konkrétní oblasti, a pak přidáte plug-in pro rozpoznávání gest při psaní, tento plug-in obdrží filtrovaná StylusPoint data.
Implementace zásuvných modulů Stylus
Implementujte zásuvný modul odvozením třídy z StylusPlugIn. Tato třída se použije na datový proud, jakmile přichází z Stylus. V této třídě můžete upravit hodnoty dat StylusPoint.
Opatrnost
Pokud StylusPlugIn vyvolá nebo způsobí výjimku, aplikace se zavře. Měli byste důkladně testovat ovládací prvky, které využívají StylusPlugIn, a použít ovládací prvek pouze v případě, že jste si jisti, že StylusPlugIn nevyvolá výjimku.
Následující příklad ukazuje zásuvný modul, který omezuje vstup pera úpravou X a Y hodnot v datech StylusPoint, která přicházejí ze zařízení Stylus.
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í zásuvného modulu do InkCanvasu
Nejjednodušší způsob, jak použít vlastní plugin, je implementovat třídu odvozenou od InkCanvas a přidat ji do vlastnosti StylusPlugIns.
Následující příklad ukazuje vlastní InkCanvas, který slouží k filtrování inkoustu.
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 inkoust není omezen na oblast, dokud uživatel nedokončí tah. Důvodem je to, že InkCanvas má vlastnost DynamicRenderer, což je StylusPlugIn a je již členem kolekce StylusPlugIns. Vlastní StylusPlugIn, které jste přidali do kolekce StylusPlugIns, obdrží data StylusPoint poté, co DynamicRenderer obdrží data. V důsledku toho nebudou StylusPoint data filtrována, dokud uživatel nezvedne pero, aby dokončil tah. Pokud chcete filtrovat rukopis během toho, co ho uživatel kreslí, musíte před DynamicRenderervložit FilterPlugin
.
Následující kód jazyka C# ukazuje vlastní InkCanvas, který filtruje inkoust při jeho kreslení.
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
Odvozením vlastních tříd StylusPlugIn a jejich vložením do StylusPlugInCollection kolekcí můžete výrazně zlepšit chování digitálního rukopisu. Při generování máte přístup k datům StylusPoint a máte možnost přizpůsobit Stylus vstup. Vzhledem k tomu, že máte přímý přístup na nízké úrovni k datům StylusPoint, můžete implementovat shromažďování inkoustu a vykreslování s optimálním výkonem pro vaši aplikaci.
Viz také
.NET Desktop feedback