Windows Phone中Map控件由浅及深
鄙人所在的OMG团队在高级软件工程课程团队项目,负责Microsoft的Academic Search在手机WP7.1上客户端的开发。现已进入十天的beta版本开发阶段。这两天用到了Map控件,我想结合自己dev的经历,对Map控件稍作介绍。
〖PS:我们是来自中国科大各个专业(数学、EE、CS)的大四学生,六个人,欢迎各位看官来我们的团队技术博客指点一二:http://www.cnblogs.com/OMG-Team/〗
Map控件,是基于Microsoft的Bing map的地图控件,在WP7能很好的使用bing map实现地图的呈现,缩放,标注和定位等功能。
首先,介绍一下Map控件的简单应用吧。
在使用Map控件之前,我们必须先注册地图获得一个Register Key才能够使用bing map,注册地址:https://www.bingmapsportal.com 。新建一个Sliverlight for Windows Phone的工程,就可以开始练习使用Map控件了。在xaml里添加一个地图控件
在.cs文件里添加register key的代码(或者不使用Binding直接写在xaml中也行)
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <my:Map Height="623" HorizontalAlignment="Left" CredentialsProvider="{Binding CredentialsProvider}" Margin="12,-22,0,0" Name="map1" VerticalAlignment="Top" Width="425"/> </Grid>
note:应该添加一个namespace:
1 using Microsoft.Phone.Controls.Maps; 2 3 namespace MapExample 4 { 5 public partial class MainPage : PhoneApplicationPage 6 { 7 const String BingMapsId = "Al7xKT8k0tvRNSCTc0uQs6AM1k-gREOdyigcbbbL4z932ynL42ySQuht1Ur6hpLI"; 8 private readonly CredentialsProvider credentialsProvider = new ApplicationIdCredentialsProvider(BingMapsId); 9 public CredentialsProvider CredentialsProvider 10 { 11 get { return credentialsProvider; } 12 } 13 // Constructor 14 public MainPage() 15 { 16 InitializeComponent(); 17 } 18 } 19 }
这样就可以运行一个最基本的map控件了。
下面,我们看看如何设置map的中心点以及Zoomlevel以及显示模式。
这个很简单只需要改变Center、 Zoomlevel和Map.Mode这几个属性的值,同样可以在xaml直接设置,或者在.cs文件里设置,当然,更高级点的用法就是对Center,zoomlevel等进行Binding了。
Map控件还有很多其他的属性,比如ZoomBarVisibility,ScaleVisibility,LogoVisibility等,这些都可以简单的进行设置或者通过Binding技术实现动态的属性值的改变。
然而,Map控件还提供添加标注,添加图片,绘制多边形,多边线等功能。
下面讲讲如何添加一个标记吧。
首先,我们可以在MainPage()里建立并初始化一个标记( 记得添加namespace: using System.Device.Location; )
1 Pushpin pin = new Pushpin(); 2 pin.Location = new GeoCoordinate(30, 120); 3 pin.Background = new SolidColorBrush(Colors.Black); 4 pin.Content = "Example"; 5 pin.Height = 40; 6 pin.Width = 80; 7 map1.Children.Add(pin); // 一定要记得添加到map1这个控件中哦~
对于多边线,我们用到的是Polyline这样一个类,多边形的绘制使用Polygon这个类,插入图片使用MapLayer类,它们的使用跟Pushpin这个类异曲同工。
以上就是一些简单的应用,那么来点实际点的。
我在开发过程中需要使用Map控件实现动态定位,找到自己的所在位置以及某个会议要举行的位置,并在切换过程中在地图中标注出相应的位置,并支持WP7.1的多点触控进行Zoomin和Zoomout。
这需要写一个page,我把它叫做MapPage,然后它的入口接收在页面Navigate时候传过来的三个值,一个是会议举行地点的经度,一个是纬度,还有一个是label,显示在标注上的文字。下面给出源代码仅供参考。
创建一个MapPage,xaml文件如下:
<phone:PhoneApplicationPage x:Class="Client.MapPage" 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" xmlns:System="clr-namespace:System;assembly=mscorlib" FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource MyPhoneForegroundBrush}" SupportedOrientations="Portrait" Orientation="Portrait" mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="728" shell:SystemTray.IsVisible="False" xmlns:my="clr-namespace:Microsoft.Phone.Controls.Maps;assembly=Microsoft.Phone.Controls.Maps"> <Canvas x:Name="LayoutRoot"> <!-- Map View --><Border x:Name="Mapw" Height="768" Width="480"><my:Map Name="Map" CredentialsProvider="{Binding CredentialsProvider}" CopyrightVisibility="Collapsed" LogoVisibility="Collapsed" ZoomLevel="{Binding Zoom, Mode=TwoWay}" Center="{Binding Center, Mode=TwoWay}"><my:Map.Mode><my:RoadMode /></my:Map.Mode> <my:MapItemsControl x:Name="mapControl"/></my:Map> <!-- TODO : Add map control --> </Border> </Canvas> <phone:PhoneApplicationPage.ApplicationBar><shell:ApplicationBar IsVisible="True" IsMenuEnabled="False"><shell:ApplicationBarIconButton IconUri="/Images/appbar.location.rest.png" Text="current" Click="CurrentLocation_Click"/><shell:ApplicationBarIconButton IconUri="/Images/appbar.next.rest.png" Text="venue" Click="VenueLocation_Click"/></shell:ApplicationBar></phone:PhoneApplicationPage.ApplicationBar> </phone:PhoneApplicationPage>
在MapPage.cs文件里完成相应的处理:
using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using Microsoft.Phone.Controls;using Microsoft.Phone.Controls.Maps;using System.Device.Location;using System.ComponentModel;using Microsoft.Phone.Controls.Maps.Core; namespace Client{public partial class MapPage : PhoneApplicationPage, INotifyPropertyChanged {public MapPage() {this.Loaded += new RoutedEventHandler(MapPage_Loaded); InitializeComponent(); InitializeDefaults(); DataContext = this; } private readonly CredentialsProvider credentialsProvider = new ApplicationIdCredentialsProvider(AcademicSearch.App.BingMapsId); public CredentialsProvider CredentialsProvider {get { return credentialsProvider; } } private MapLayer pushpinLayer;private string pushpinLabel;private Pushpin locationMark;void MapPage_Loaded(object sender, RoutedEventArgs e) { NotifyPropertyChanged("Zoom"); NotifyPropertyChanged("Center"); pushpinLayer = new MapLayer(); Map.Children.Add(pushpinLayer); pushpinLayer.AddChild(new Pushpin() {Content =new Border() { Child = new TextBlock() { Text = pushpinLabel },
Background=new SolidColorBrush(Colors.Black)}}, Center); locationMark = new Pushpin() { Content = new Border() { Child = new TextBlock() { Text = "You Are Here!" },
Background = new SolidColorBrush(Colors.Black) } }; pushpinLayer.AddChild(locationMark, new GeoCoordinate(0, 0)); } protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) {base.OnNavigatedTo(e);string longitudeStr;string latitudeStr;if (NavigationContext.QueryString.TryGetValue("longitude", out longitudeStr) && NavigationContext.QueryString.TryGetValue("latitude", out latitudeStr)) {double latitude; double longitude;if (Double.TryParse(latitudeStr, out latitude) && Double.TryParse(longitudeStr, out longitude)) { Center = new GeoCoordinate(latitude, longitude); Venue = new GeoCoordinate(latitude, longitude); Zoom = DefaultZoomLevel; }string label;if (NavigationContext.QueryString.TryGetValue("label", out label)) { pushpinLabel = label; }else { pushpinLabel = ""; } } } public void AddPushpin(GeoCoordinate location) { Pushpin pushpin = new Pushpin(); pushpin.Content = "Test"; pushpinLayer.AddChild(pushpin, location); } ///<summary>/// Gets or sets the map zoom level.///</summary> private const double DefaultZoomLevel = 17.0;private const double MaxZoomLevel = 21.0;private const double MinZoomLevel = 1.0; private double _zoom = DefaultZoomLevel;public double Zoom {get { return _zoom; }set {var coercedZoom = Math.Max(MinZoomLevel, Math.Min(MaxZoomLevel, value));if (_zoom != coercedZoom) { _zoom = value; NotifyPropertyChanged("Zoom"); } } } private GeoCoordinateWatcher loc = null; private void CurrentLocation_Click(object sender, EventArgs e) {//Zoom += 1; if (loc == null) { loc = new GeoCoordinateWatcher(GeoPositionAccuracy.Default); loc.StatusChanged += loc_StatusChanged; }if (loc.Status == GeoPositionStatus.Disabled) { loc.StatusChanged -= loc_StatusChanged; MessageBox.Show("Location services must be enabled on your phone.");return; } loc.Start(); } void loc_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e) { if (e.Status == GeoPositionStatus.Ready) { locationMark.Location = loc.Position.Location; Map.SetView(loc.Position.Location, 17.0); loc.Stop(); } } private void VenueLocation_Click(object sender, EventArgs e) { Map.SetView(Venue, 17.0); } private GeoCoordinate _center;public GeoCoordinate Center {get { return _center; }set {if (_center != value) { _center = value; NotifyPropertyChanged("Center"); } } } private GeoCoordinate Venue; public event PropertyChangedEventHandler PropertyChanged;private void NotifyPropertyChanged(String propertyName) { PropertyChangedEventHandler handler = PropertyChanged;if (null != handler) { handler(this, new PropertyChangedEventArgs(propertyName)); } } public bool HasDirections {get {// TODO : Return true only if has directions. return true; } } #region Tasks private void InitializeDefaults() {// TODO : Initialize default properties. } private void ChangeMapMode() {// TODO : Change map view mode. } private void IncreaseZoomLevel() {// TODO : Increases zoom level. } private void DecreaseZoomLevel() {// TODO : Decreases zoom level. } private void CenterLocation() {// TODO : Center current location. } private void CenterPushpinsPopup(Point touchPoint) {// TODO : Center pushpins popup to the touch point. } private void CreateNewPushpin(object selectedItem, Point point) {// TODO : Create a new pushpin. } private void CalculateRoute() {// TODO : Calculate a route. } #endregion }}
MSRA-USTC Class
OMG team
转载于:https://www.cnblogs.com/OMG-Team/archive/2011/11/18/2253609.html
Windows Phone中Map控件由浅及深相关推荐
- Delphi控件开发浅入深出(三)
三.开关控件TlincoSwitch 用过Delphi1(好古老的东东呀!)的人相信都记得这个开关控件 ,不知道当初Borland为什么把这么一个在开发普通应用程序中应用不到的工控控件放到Delphi ...
- Delphi控件开发浅入深出(一)
有人说过"不会开发控件的Delphi程序员不是真正的程序员".Delphi正是由于高度的可扩展性和大量的第三方控件的支持才能吸引无数程序员挑剔的目光.即使是由于工作需要使用其他开发 ...
- Windows MObile中ListView控件的用法详解
-前言:ListView在Windows Mobile中的应用非常广泛,也是Windows Mobile中很重要的一个控件,在此俺新手给他做个总结,方便其它新手参考哈! --------------- ...
- 一起学windows phone7开发(二十一.二 Map控件的简单使用)
1. 注册地图: 在使用地图之前必须先申请register key https://www.bingmapsportal.com/ 将申请到的key填到这个属性,地图才可以正常使用. Credenti ...
- 用ASP.NET AJAX框架扩展HTML Map控件
[摘要]在本文中,我将向你展示如何使用ASP.NET AJAX框架对添加可点击的热点的HTML Map控件进行扩展.经扩展后,当我们的鼠标移动到这些热点上后,即弹出关于这些热点的详细信息;但是,这些详 ...
- 11. Windows应用程序常用控件
Windows应用程序常用控件 1 控件概述 1.1 控件的分类及作用 1.2 控件的命名规范 1.2 控件的相关操作 2.1 添加控件 2.2 对齐控件 2.3 锁定控件 2.4 删除控件 3 文本 ...
- .NET中添加控件数组
作者:cuike519的专栏 http://blog.csdn.net/cuike519/ 添加控件数组 在.NET里面我好像没有找到有关于控件数组的说明,但是前两天偶在网上看到了一篇关于如何在. ...
- Silverlight中使用控件模板的问题(自己添加控件的方法)
在一步一步学Silverlight 2系列(9):使用控件模板中 WatermarkedTextBox控件可以为用户的输入提供一段提示信息,如果只是简单的一点文字信息,有时候未免显得单调,如果加上相应 ...
- android中ListView控件onItemClick事件中获取listView传递的数据
http://blog.csdn.net/aben_2005/article/details/6592205 本文转载自:android中ListView控件&&onItemClick ...
- Windows 8.1 新增控件之 DatePicker
Windows 8.1 新增控件之 DatePicker 原文:Windows 8.1 新增控件之 DatePicker 大年初一来介绍一个简单易用的DatePicker 控件,这个控件是新增的?印象 ...
最新文章
- 三维重建:深度传感技术的中外差异
- HttpWebRequest与HttpWebResponse进行数据采集时的注意点
- 使用Spring boot,Thymeleaf,AngularJS从零开始构建一个新的Web应用程序-第1部分
- leetcode132. 分割回文串 II(dp)
- php铺满,重复铺满水印 - Jun. - OSCHINA - 中文开源技术交流社区
- html5(八) IndexedDB
- LR中Action,Transaction,Rendezvous,SubmitData的插入顺序请注意
- circPrimer:环状RNA注释和引物设计工具
- ssh连接服务器超时解决方案
- 第一次登陆阿里云ECS云服务器及其配置
- 启动springboot报错:程序包org.springframework.boot不存在
- Python免费发短信
- 知识付费平台年度排行榜!哪些平台活着其实已经死了?
- 搜索计算机文件夹的记录怎么删除,怎样删除电脑最近打开的文件或文件夹?
- 洛谷 - P1008 [NOIP1998 普及组] 三连击 [Java版]
- linux查看电源状态命令,Linux下查看电池损耗等信息
- Linux-2.6 所有版本内核源码下载
- virtual 关键字
- Arduino提高篇23—OLED电子时钟
- 单片机带掉电保护c语言,基于LM358的单片机掉电保护电路
热门文章
- python 报了错TypeError: sequence item 0: expected str instance, int found
- 帆软数据集函数ds1.select()和ds1.group()函数的使用
- 30岁中专自学java,19岁中专毕业 工作两年感觉就是混日子 想再去学个软件编程 我这个学历学他有前途吗?...
- java路径通配符_java实现路径通配符*,**,?
- React动画实现原理
- 2012-12-17 → 2013-01-20 周总结:五周没写周总结了,今天来总结下
- JVM monitoring
- Iptables基本概念及应用
- 联想笔记本安装xp sp3 GHOST版无法安装声卡问题
- mybatis-generator生成的mapper中的