Перехват ввода, осуществляемого пером
System.Windows.Input.StylusPlugIns Архитектура предоставляет механизм для реализации низкоуровневого управления Stylus входных данных и создание рукописный ввод Stroke объектов. StylusPlugIn Класс предоставляет механизм для реализации пользовательского поведения и применения его к потоку данных, поступающих от устройства пера, для обеспечения оптимальной производительности.
В этом разделе содержатся следующие подразделы:
Архитектура
StylusPlugIn Развитие потоке API-интерфейсы, описанные в получение и управление с помощью перав Microsoft Windows XP Tablet PC Edition программного обеспечения Комплект SDK 1.7.
Каждый UIElement имеет StylusPlugIns свойства, которое является StylusPlugInCollection. Вы можете добавить StylusPlugIn к элементу StylusPlugIns свойства для управления StylusPoint данных, так как он создается. StylusPoint данные состоят из всех свойств, поддерживаемых дигитайзером системы, включая X и Y точки данных, а также PressureFactor данных.
Ваш StylusPlugIn объектов вставляются непосредственно в поток данных, поступающих от Stylus устройства при добавлении StylusPlugIn для StylusPlugIns свойство. Порядок, в котором подключаемые модули добавляются StylusPlugIns коллекции определяет порядок, в котором они получат StylusPoint данных. Например, если добавить подключаемый модуль фильтра, ограничивающий входные данные для определенного региона и затем добавить подключаемый модуль, который распознает жесты, так как они записаны, подключаемый модуль, который распознает жесты будет получать отфильтрованные StylusPoint данных.
Реализация подключаемых модулей пера
Для реализации подключаемого модуля, являются производными от класса StylusPlugIn. Этот класс является o применяется к потоку данных, как поступающие из Stylus. В этом классе можно изменить значения StylusPoint данных.
Caution
Если StylusPlugIn создает или вызывает исключение, приложение будет закрыто. Необходимо тщательно протестировать элементы управления, которые используют StylusPlugIn и использовать элемент управления, только если вы уверены, StylusPlugIn не вызовет исключение.
В следующем примере показан подключаемый модуль, который ограничивает ввод с помощью пера, изменив X и Y значения в StylusPoint данных по мере поступают из Stylus устройства.
using System;
using System.Windows.Media;
using System.Windows;
using System.Windows.Input.StylusPlugIns;
using System.Windows.Input;
using 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);
}
}
Добавление подключаемого модуля к объекту класса InkCanvas
Самый простой способ использовать пользовательский подключаемый модуль должен реализовать класс, производный от InkCanvas и добавьте его в StylusPlugIns свойство.
В следующем примере показано пользовательское InkCanvas , фильтрующее рукописный ввод.
public class FilterInkCanvas : InkCanvas
{
FilterPlugin filter = new FilterPlugin();
public FilterInkCanvas()
: base()
{
this.StylusPlugIns.Add(filter);
}
}
Если вы добавите FilterInkCanvas
к приложению и запустить его, вы заметите, что рукописные данные не ограничены областью, пока пользователь не завершит штрих. Это обусловлено InkCanvas имеет DynamicRenderer свойство, являющееся StylusPlugIn и уже является членом StylusPlugIns коллекции. Пользовательский StylusPlugIn добавленные StylusPlugIns Получает коллекцию StylusPoint данных после DynamicRenderer получает данные. В результате StylusPoint данные не будут фильтроваться до, после пользователь отрывает перо, чтобы завершить штриха. Чтобы отфильтровать рукописный ввод, когда пользователь рисует его, необходимо вставить FilterPlugin
перед DynamicRenderer.
Следующий код C# демонстрирует пользовательский InkCanvas , фильтрующее рукописный ввод, так как он отрисовывается.
public class DynamicallyFilteredInkCanvas : InkCanvas
{
FilterPlugin filter = new FilterPlugin();
public DynamicallyFilteredInkCanvas()
: base()
{
int dynamicRenderIndex =
this.StylusPlugIns.IndexOf(this.DynamicRenderer);
this.StylusPlugIns.Insert(dynamicRenderIndex, filter);
}
}
Заключение
Путем наследования своих собственных StylusPlugIn классы и вставки их в StylusPlugInCollection коллекций, можно значительно улучшить обработку цифровых рукописных данных. У вас есть доступ к StylusPoint данных, как оно создается, дает возможность настроить Stylus ввода. Так как у вас есть такой низкоуровневый доступ к StylusPoint данных, можно реализовать коллекцию чернил и подготовки к просмотру, обеспечивающих оптимальную производительность для вашего приложения.