Главная » Разработка для Windows Phone 7 » Jot и сенсорный ввод

0

Область содержимого в Jot невелика, но играет важную роль: Проект Silverlight: Jot Файл: MainPage.xaml (фрагмент)

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">

<InkPresenter Name="inkPresenter" /> </Grid>

Как предполагает его имя, класс InkPresenter формирует виртуальный рукописный фрагмент на основе ввода со стилуса или касания. InkPresenter не распознает этот ввод самостоятельно, об этом должен позаботиться разработчик. (И в Silverlight нет встроенной функциональности для распознавания рукописного ввода, но нам ничего не мешает реализовать ее самостоятельно.)

В файле выделенного кода с помощью директивы using необходимо подключить пространство имен System.Windows.Ink и описать всего два закрытых поля:

Проект Silverlight: Jot Файл: MainPage.xaml.cs (фрагмент)

public partial class MainPage : PhoneApplicationPage {

JotAppSettings appSettings = (Application.Current as App).AppSettings; Dictionary<int, Stroke> activeStrokes = new Dictionary<int, Stroke>();

public MainPage() {

InitializeComponent();

inkPresenter.Strokes = appSettings.StrokeCollections[appSettings.PageNumber];

inkPresenter.Background = new SolidColorBrush(appSettings.Background); TitleAndAppbarUpdate();

Touch.FrameReported += 0nTouchFrameReported;

}

}

Первое поле обеспечивает удобный доступ к параметрам приложения, предоставляемым классом App. Второе – предназначено для сохранения данных мультисенсорного ввода. Конструктор инициализирует свойства Strokes и Background класса InkPresenter, используя данные приложения, и завершается заданием обработчика для низкоуровневого события Touch.FrameReported. (Метод TitleAndAppbarUpdate (Обновить заголовок и панель приложения) обсудим несколько позже.)

Я решил использовать простой сенсорный ввод, потому что данное приложение не выполняет никакой обработки. Оно просто принимает координаты точек касания соответственно перемещениям пальца по экрану. Событие Touch.FrameReported позволяет приложению принимать ввод от нескольких касаний одновременно, но, безусловно, это требует определенных ухищрений на практике.

Если помните, при использовании события Touch.FrameReported каждое касание идентифицируется целочисленным ID с момента прикосновения к экрану до момента снятия касания. В данном приложении в результате прикосновения формируется новый Stroke для свойства Strokes класса InkPresenter. Для сохранения ID касания, ассоциированного с соответствующим Stroke, предусмотрен словарь (Dictionary), который я назвал activeStrokes (Активные обводки):

Dictionary<int, Stroke> activeStrokes = new Dictionary<int, Stroke>();

Рассмотрим обработчик события OnTouchFrameReported (Уведомление о касании):

Проект Silverlight: Jot Файл: MainPage.xaml.cs (фрагмент)

void 0nTouchFrameReported(object sender, TouchFrameEventArgs args) {

TouchPoint primaryTouchPoint = args.GetPrimaryTouchPoint(null);

if (primaryTouchPoint != null && primaryTouchPoint.Action == TouchAction.Down) args.SuspendMousePromotionUntilTouchUp();

TouchPointCollection touchPoints = args.GetTouchPoints(inkPresenter);

foreach (TouchPoint touchPoint in touchPoints) {

Point pt = touchPoint.Position; int id = touchPoint.TouchDevice.Id;

switch (touchPoint.Action) {

case TouchAction.Down:

Stroke stroke = new Stroke();

stroke.DrawingAttributes.Color = appSettings.Foreground; stroke.DrawingAttributes.Height = appSettings.StrokeWidth; stroke.DrawingAttributes.Width = appSettings.StrokeWidth; stroke.StylusPoints.Add(new StylusPoint(pt.X, pt.Y));

inkPresenter.Strokes.Add(stroke); activeStrokes.Add(id, stroke); break;

case TouchAction.Move:

activeStrokes[id].StylusPoints.Add(new StylusPoint(pt.X, pt.Y)); break;

case TouchAction.Up:

activeStrokes[id].StylusPoints.Add(new StylusPoint(pt.X, pt.Y)); activeStrokes.Remove(id);

TitleAndAppbarUpdate();

break;

}

}

}

При первом касании экрана (о чем сигнализирует значение TouchAction.Down свойства Action (Действие)) этот метод создает новый объект Stroke. Он добавляется в коллекцию Strokes класса InkPresenter, и InkPresenter повторно визуализирует его при добавлении каждой новой точки. Данный объект Stroke вместе с его ID также сохраняется в словаре activeStrokes. Это позволяет достраивать объект Stroke с каждым новым событием TouchAction.Move. Когда касание прекращается, запись удаляется из словаря.

Источник: Чарльз Петзольд, Программируем Windows Phone 7, Microsoft Press, © 2011.

По теме:

  • Комментарии