45 дней с Windows Phone 7. День #19. Элемент управления Map.
<< День #18. элемент управления WebBrowser.| День #20. Уведомления (Push Notifications) >>
Это девятнадцатая статья серии «45 дней с Windows Phone 7».
Вчера мы говорили про элемент управления «WebBrowser», с помощью которого можно отображать не только web сайты, но и произвольно сгенерированный HTML. Сегодня мы рассмотрим более специфический элемент управления, который позволяет показывать карту в Windows Phone 7 Silverlight приложениях. Название данного элемента управления весьма логично, он называется «Map» – карта.
Использование элемента управления «Map».
Перетащите элемент управления Map из Toolbox на страницу Silverlight приложения. При этом подключится соответствующее XML пространство имён:
xmlns:map="clr-namespace:Microsoft.Phone.Controls.Maps; assembly=Microsoft.Phone.Controls.Maps"
После того как я задал позиционирование и размеры для карты, XAML код элемента управления выглядит следующим образом:
<map:Map Height="607" HorizontalAlignment="Left" Name="myMap" VerticalAlignment="Top" Width="456" />
Запустим приложение и посмотрим на карту.

Посмотрев на иллюстрацию выше, Вы, наверное, хотите спросить меня про белую надпись посередине карты, с текстом: «Invalid Credentials. Sign up for a developer account.». Если вкратце, нам нужен ключ API для работы с картой. Далее в статье я расскажу, как такой ключ получить (абсолютно бесплатно, надо заметить), а также мы рассмотрим множество других аспектов работы с картой.
Регистрация аккаунта разработчика и получение ключа для работы с картой.
Регистрация аккаунта разработчика и получение ключа для работы с картой.
Итак, зайдите на портал Bing Maps и зарегистрируйтесь. Поле регистрации создайте новый ключ API в разделе «Create or view keys». Форма создания нового ключа представлена на иллюстрации ниже.

В качестве «Application URL» можете ввести адрес Вашего web сайта. После заполнения формы Вы получите ключ, похожий на данный:
AsWlUnHbvLgHlLHaRhTZLslewv1QIdGppxOqyL-6He2jxyHvLAjutrcntemUih-w9
(Нет, это не мой ключ. Я заменил достаточно много знаков. Но показанный ключ похож на тот, что Вы получите).
Задаём Credentials Provider.
После того, как Вы получите ключ API, данный ключ надо задать в приложении. Если в Вашем приложении только одна карта, просто напишите ключ в свойстве «CredentialsProvider» элемента управления «Map».
<map:Map CredentialsProvider= "AsWlUnHbvLgHlLHaRhTZLslewv1QIdGppxOqyL-6He2jxyHvLAjutrcntemUih-w9"/>
Но, если карт в приложении несколько, лучше использовать другой подход: определить ключ API один раз в файле App.xaml, а потом с помощью механизма связывания данных задать ключ для каждой карты. Далее приведу код, добавляемый в файл App.xaml при использовании данного подхода:
<Application.Resources> <map:ApplicationIdCredentialsProvider ApplicationId= "AsWlUnHbvLgHlLHaRhTZLslewv1QIdGppxOqyL-6He2jxyHvLAjutrcntemUih-w9" x:Key="BingMapsAPIKey"/> </Application.Resources>
Теперь свойство «CredentialsProvider» у элемента управления Map измениться:
<map:Map CredentialsProvider="{StaticResource BingMapsAPIKey}">
После задания «CredentialsProvider» запустите приложение. Белая надпись посреди карты должна исчезнуть.
Добавляем точки(Pushpin) на карту.
Мы можем добавить пользовательские точки на карту как с помощью C# кода, так и в XAML разметке. Для добавления точки требуется определить местоположение, а также содержимое, являющееся, по сути, подписью. Добавим точку в XAML разметке:
<map:Map CredentialsProvider= "AsWlUnHEvLgHlLHaRqTZLslewv1QIdGppxOqyL-7He2jxyHvLAjutrcntemUih-w9"> <map:Pushpin Location="40.1449, -82.9754" FontSize="30" Background="Orange" Content="1" /> </map:Map>
Аналогичный результат можно получить и с помощью C# кода:
Pushpin pushpin = new Pushpin(); Location location = new Location(); location.Latitude = 40.1449; location.Longitude = -82.9754; pushpin.Location = location; pushpin.Background = new SolidColorBrush(Colors.Orange); pushpin.Content = "1"; pushpin.FontSize = 30; MapControl.Children.Add(pushpin);
На иллюстрации ниже показано, как только что добавленная нами точка выглядит на карте.

Если Вам интересно как преобразовать какой-либо адрес в значение широты/долготы, прочтите соответствующую статью. Данная статья описывает работу с картами в десктопном Silverlight, но актуальна и для работы с картами на телефоне.
Добавляем на карту произвольные фигуры.
Полезным классом при работе с картой является «MapPolygon». MapPolygon позволяет задать список координат, по которым на карте рисуется фигура. Данная фигура позиционируется в нужное место карты независимо от прокрутки и изменения масштаба карты. Координаты являются значениями широты/долготы, что позволяет обозначить на карте страны, регионы, места для парковки, да и вообще все, что может потребоваться обозначить в Вашем приложении. Далее я добавляю простую фигуру на карту:
XAML
<map:MapPolygon Fill="Purple" Stroke="White" Opacity=".7" Locations="40.1449,-82.9754 40.1449,-12.9754 10.1449,-82.9754" />
C#
MapPolygon mapPolygon = new MapPolygon(); mapPolygon.Fill = new SolidColorBrush(Colors.Purple); mapPolygon.Stroke = new SolidColorBrush(Colors.White); mapPolygon.Opacity = .7; LocationCollection locations = new LocationCollection(); Location location = new Location(); location.Latitude = 40.1449; location.Longitude = -82.9754; Location location1 = new Location(); location1.Latitude = 40.1449; location1.Longitude = -12.9754; Location location2 = new Location(); location1.Latitude = 10.1449; location1.Longitude = -82.9754; locations.Add(location); locations.Add(location1); locations.Add(location2); mapPolygon.Locations = locations; MapControl.Children.Add(mapPolygon);
Теперь на карте у нас есть точка и фигура. Как это выглядит показано на иллюстрации ниже.

Если Вам интересны другие возможности по работе с картой, обратите внимание на Bing Maps Silverlight Control Interactive SDK. Там вы найдёте много полезной информации.
Пример кода.
Пример кода показывает, как добавить точку и фигуру на карту в XAML разметке и C# коде. Естественно применять два способа одновременно не нужно, выберете один и используйте его.

















