Сенсорный пользовательский интерфейс
Особенности взаимодействия с сенсорным экраном
Элементы управления, которыми мы пользовались до сих пор, позволяют обрабатывать стандартные варианты взаимодействия с ними с использованием обработчиков событий. Например, обработав событие Click кнопки можно задать реакцию системы на касание кнопки. Среди стандартных событий элементов управления можно обнаружить и другие события для обработки сенсорного ввода. Например, DoubleTap – для двойного касания, Hold – для удержания.
Состав событий, связанных с сенсорным экраном для конкретного элемента управления отражает специфику его использования. В то же время, среди этих событий нет, например, таких, как события, служащие для обработки сложных жестов. Например – жеста Flick, когда пользователь касается экрана, быстро проводит пальцем и, не останавливая движения, отрывает палец от экрана. Например – популярных жестов сжатия/растяжения (Pinch/Zoom) для масштабирования объектов.
Поддержку жестов можно реализовать самостоятельно, если обработать события ManipulationStarted (происходит при начале манипуляции), ManipulationDelta (происходит в процессе манипуляции, повторяется), и ManipulationCompleted (Происходит при завершении манипуляции). В проекте P15_1 использование манипуляций для перемещения окружности с градиентной заливкой по экрану показано на странице EventsAndGestures.xaml.
Кроме того, можно обработать низкоуровневые события, воспользовавшись классом TouchPoint.
Для того, чтобы упростить обработку жестов, можно воспользоваться библиотекой Windows Phone Toolkit – её можно подключить к проекту с помощью менеджера пакетов NuGet. Вот сайт проекта: http://phone.codeplex.com/. Найти библиотеку можно, введя в строку поиска запрос "wptoolkit". Эта библиотека, помимо набора элементов управления, предоставляет классы GestureService и GestureListener, предназначенные для обработки популярных жестов. В частности, поддерживаются следующие события:
- GestureBegin – вызывается в начале касания
- GestureCompleted – вызывается в конце касания
- Tap – вызывается при выполнении жеста касания (палец касается экрана и быстро отрывается от экрана)
- DoubleTap – вызывается при двойном касании экрана
- Hold – вызывается при выполнении жеста удержания
- DragStarted – вызывается в начале жеста перетаскивания
- DragDelta – вызывается в процессе перетаскивания
- DragCompleted – вызывается при окончании перетаскивания
- Flick – вызывается когда пользователь касается экрана, быстро проводит пальцем и, не останавливая движения, отрывает палец от экрана
- PinchStarted – вызывается в начале жеста сжатия/растяжения
- PinchDelta – вызывается в процессе выполнения жеста сжатия/растяжения
- PinchCompleted – вызывается в конце жеста сжатия/растяжения
Демонстрация обработки жестов Flick и Hold с помощью Windows Phone Toolkit сделана на примере прямоугольника на странице EventsAndGestures.xaml, рис. 45.3.
Обратите внимание на то, как выглядит XAML-код страницы, на которой расположены элементы (Листинг 45.2). Здесь, во-первых, объявлено пространство имен toolkit. Во-вторых, для прямоугольника указаны обработчики событий Flick и Hold. По первому событию мы увеличиваем длину прямоугольника, по второму – сбрасываем прямоугольник в исходное состояние.
<phone:PhoneApplicationPage x:Class="P15_1.EventsGestures" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}" SupportedOrientations="Portrait" Orientation="Portrait" mc:Ignorable="d" xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit" shell:SystemTray.IsVisible="True"> <!--LayoutRoot представляет корневую сетку, где размещается все содержимое страницы--> <Grid x:Name="LayoutRoot" Background="Transparent"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!--TitlePanel содержит имя приложения и заголовок страницы--> <StackPanel Grid.Row="0" Margin="12,17,0,28"> <TextBlock Text="СЕНСОРНЫЙ ВВОД" Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock Text="жесты" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> </StackPanel> <!--ContentPanel – поместите здесь дополнительное содержимое--> <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Rectangle Fill="{StaticResource PhoneAccentBrush}" HorizontalAlignment="Left" Height="100" Margin="147,109,0,0" Stroke="Black" VerticalAlignment="Top" Width="100"> <toolkit:GestureService.GestureListener> <toolkit:GestureListener Flick="GestureListener_Flick" Hold="GestureListener_Hold"> </toolkit:GestureListener> </toolkit:GestureService.GestureListener> </Rectangle> <TextBlock HorizontalAlignment="Left" Margin="24,25,0,0" TextWrapping="Wrap" Text="Жест скольжения для увеличеия размера, жест удержания - для возврата" VerticalAlignment="Top"/> <Ellipse x:Name="ellipseToDrag" HorizontalAlignment="Left" Height="100" Margin="147,399,0,0" Stroke="Black" VerticalAlignment="Top" Width="100" ManipulationDelta="Ellipse_ManipulationDelta"> <Ellipse.Fill> <RadialGradientBrush> <GradientStop Color="#FFE51400" Offset="1"/> <GradientStop Color="#FFF5F3F3"/> </RadialGradientBrush> </Ellipse.Fill> </Ellipse> <TextBlock HorizontalAlignment="Left" Margin="24,299,0,0" TextWrapping="Wrap" Text="Эту фигуру можно перемещать" VerticalAlignment="Top"/> </Grid> </Grid> </phone:PhoneApplicationPage>Листинг 45.2. Код файла EventsGestures.xaml