Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Применение Yandex MapKit коллективно с элементами управления Pivot и Panorama

Anna | 17.06.2014 | нет комментариев
Основная страница нашего приложения построена с применением элемента управления Pivot, на одной из закладок которого нужно было поместить карту с информацией о местоположении автомобиля. Пользователям нашего приложения было решено предоставить выбор между сервисами карт от компании Микрософт и компании Яндекс.

Интеграция встроенного обслуживания карт не составило никакого труда, так как элемент управления для отображения карт является частью операционной системы, и его интеграция со всеми стандартными элементами управления отработана до мелочей.

Впрочем с интеграцией элемента управления для отображения карт входящего в Yandex.Map MapKit от компании Яндекс появились непредвиденные трудности. Попытки манипуляции картой в горизонтальной плоскости приводили к переключению нынешней закладки элемента управления Pivot.

Постижение задачи показало, что в Windows Phone 8 были произведены оптимизации обработки жестов. В итоге чего, события о манипуляциях пользователя могут перехватываться встроенными элементами управления, до передачи их в дочерние элементы управления. Перехват событий осуществляют следующие элементы управления: DrawingSurface, DrawingSurfaceBackgroundGrid, ListBox, LongListSelector, Map, Panorama, Pivot, ScrollViewer, ViewportControl, WebBrowser.

К сожалению инструментарий Yandex.Maps MapKit огромнее не поддерживается компанией Яндекс, а последняя доступная версия разработана для Windows Phone 7.5 в которой указанные оптимизации отсутствуют.

Оптимизации операционной системы дозволено отключить установив значение свойстваUseOptimizedManipulationRouting элемента управления в false. Но позже установки значения свойства поведение приложения не изменилось. Все дело в том, что включив обработку жестов для элемента управления, так же нужно обработать события: ManipulationStartedManipulationDelta и ManipulationCompleted. Нам нет необходимости обрабатывать жесты пользователя в этих обработчиках, так как этим занимается элемент управления Map, довольно установить флаг Handled в true уведомив остальные элементы управления, что событие теснее обработано.

Позже описанных действий приложение начинает трудиться как ожидается, а именно при манипулировании картой во всех плоскостях, не происходит смены нынешней закладки элемента управления Pivot.

Проведение указанных действий дозволено перенести на декларативный ярус, реализовав присоединяемое качество и реализовав все выше описанное в его обработчике

using System.Windows;
using Yandex.Maps;

namespace YandexMapKit
{
	public static class YandexMapHelper
	{
		public static readonly DependencyProperty FixManipulationProperty = DependencyProperty.RegisterAttached(
			"FixManipulation", typeof(bool), typeof(YandexMapHelper), new PropertyMetadata(OnFixManipulationChanged));

		public static void SetFixManipulation(DependencyObject element, bool value)
		{
			element.SetValue(FixManipulationProperty, value);
		}

		public static bool GetFixManipulation(DependencyObject element)
		{
			return (bool) element.GetValue(FixManipulationProperty);
		}

		private static void OnFixManipulationChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
		{
			var map = d as Map;
			if (map == null)
			{
				return;
			}

			var fixManipulation = (bool?) e.NewValue;

			if (fixManipulation == true)
			{
				map.UseOptimizedManipulationRouting = false;

				map.ManipulationStarted  = MapManipulationStarted;
				map.ManipulationCompleted  = MapManipulationCompleted;
				map.ManipulationDelta  = MapManipulationDelta;

				return;
			}

			fixManipulation = (bool?)e.OldValue;

			if (fixManipulation == true)
			{
				map.UseOptimizedManipulationRouting = true;

				map.ManipulationStarted -= MapManipulationStarted;
				map.ManipulationCompleted -= MapManipulationCompleted;
				map.ManipulationDelta -= MapManipulationDelta;
			}
		}

		private static void MapManipulationDelta(object sender, System.Windows.Input.ManipulationDeltaEventArgs e)
		{
			e.Handled = true;
		}

		private static void MapManipulationCompleted(object sender, System.Windows.Input.ManipulationCompletedEventArgs e)
		{
			e.Handled = true;
		}

		private static void MapManipulationStarted(object sender, System.Windows.Input.ManipulationStartedEventArgs e)
		{
			e.Handled = true;
		}
	}
}

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB