`
gaofen100
  • 浏览: 1227910 次
文章分类
社区版块
存档分类
最新评论

Windows Phone中Map控件由浅及深

 
阅读更多

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

    }
}
0
0
分享到:
评论

相关推荐

    Telerik最新2012第三季度 WindowsPhone开发控件

    2012年第三季度,Telerik发布了一套针对Windows Phone平台的开发控件,旨在帮助开发者更加高效、便捷地构建高质量的Windows Phone应用程序。这个压缩包文件"RadControls_for_WindowsPhone_2012_3_1016_DEV.msi"很...

    Step into Windows Phone 8 进入Windows Phone8开发殿堂

    列表选择器(List Picker)是Windows Phone 8中用于从列表中选择数据的一种控件。它提供了一种简洁的方式来让用户从预定义的列表中选择选项,这对于表单和选择器的设计至关重要。 在Windows Phone 8应用开发中,...

    windowsPhone8地图demo

    Windows Phone 8平台提供了Microsoft.Phone.Maps.Controls命名空间,该命名空间包含了用于地图集成的主要控件和类。主要的知识点包括: 1. **MapControl**: 这是核心的地图控件,可以在XAML界面中添加,通过设置其...

    Windows Phone Toolkit源码

    Windows Phone Toolkit(WP7 WindowsPhone Toolkit Mango)是针对Windows Phone Mango(即Windows Phone 7.5)更新的扩展库,它包含了一系列预构建的UI控件和...,这些控件和功能并未在原生的Windows Phone SDK中提供...

    Windows_Phone_7_使用BingMaps

    本练习的目标是帮助你了解如何注册 Bing Maps 帐号并获取私钥,以及如何在 Windows Phone 中使用 Bing Silverlight Map 控件。 1. **注册 Bing Maps 帐号并获取私钥** - 访问 Bing Maps Developer Center 注册帐号...

    Telerik RadControls for Windows Phone 8 2013 Q3 2013.3.1016

    【Telerik RadControls for Windows Phone 8 2013 Q3 2013.3.1016】是Telerik公司为Windows Phone 8平台开发的一套UI控件集,它专为.NET Framework的C#和XAML开发者设计,提供了丰富的用户界面组件,以帮助开发者...

    Windows Phone 8 JumpStart Module 14 Location and Maps Demos

    通过Maps控件(Microsoft.Phone.Maps.Controls.Map)可以在应用中展示地图,通过设置Center和ZoomLevel属性可以调整地图的显示位置和缩放级别。MapLayer和MapOverlay类则用于添加自定义内容,如图片、文本或形状,...

    Telerik RadControls for Windows Phone 8 2013 Q2 2013.2.0612

    1. **控件丰富性**:Telerik RadControls包含了大量的预构建控件,如ListView、GridView、Calendar、Chart、Map、DataForm等,这些控件已经过优化,可以很好地适应Windows Phone 8的触摸交互和设计风格,大大提高了...

    [开发工具] Telerik RadControls for Windows Phone 2012.2 607 零售版

    Telerik RadControls 是一个知名的开发工具集,由Telerik公司提供,专为开发者设计,用于构建高质量的Windows Phone应用程序。2012.2 607零售版是该产品线的一个特定版本,它为开发者提供了丰富的UI控件和功能,旨在...

    winphone7的bingmap实例sample

    【winphone7的bingmap实例sample】是一个专为Windows Phone 7平台设计的示例项目,它详细展示了如何集成和使用Bing Maps服务。这个样本集成了Bing Maps API,帮助开发者了解如何在Windows Phone应用中实现地图功能,...

    iphone 开发基础控件自定义UIButton之UICheckBox

    在iOS中,并没有直接提供这样的控件,所以我们需要自己创建。 自定义`UICheckBox`的第一步是创建一个新的类,继承自`UIButton`。这样我们可以利用`UIButton`已有的功能,如设置标题、图像和点击事件,同时添加我们...

    WP8-MapGestures:一组用于 Windows Phone 8 地图控件的增强型多点触控手势

    增强的 Windows Phone 8 地图手势如以下博客文章所述: 只需一行代码即可将旋转或俯仰手势添加到您的地图控件中: new MapRotationGesture(map);new MapPitchGesture(map);

    wp-maps:一个静态映射 Windows Phone 控件

    杰夫威尔科克斯地图每当您查看应用程序中的某个地点时,Windows Phone 应用程序的精美视觉效果之一,带有简单区域地图的映射显示。 不幸的是,大多数地图控件,例如平台中包含的 Bing 地图控件,都非常复杂:它们让...

    Windows Phone:位置:地图:图钉

    5. **地图控件(Map Control)**:Windows Phone SDK提供了一个内置的地图控件,允许在应用中嵌入交互式地图。通过`Map`类,开发者可以设置地图的中心点、缩放级别、视图模式等,并可以添加图层和图钉。`Pushpin`是...

    使用 Bing Maps

    - 实验的目标是使开发者熟悉Bing Maps for Windows Phone,掌握Bing Map控件和数据绑定的使用,以及如何获取和显示地图数据。 - 开始实验前,需要安装Visual Studio、Windows Phone开发工具以及具备稳定的互联网...

    WP7 Coding4Fun控件工具v1.60源码2012815

    Windows Phone 7 (WP7) 开发者社区中的Coding4Fun项目,是一个致力于创新和趣味性开发的平台,它为开发者提供了大量独特且吸引人的控件和工具。Coding4Fun控件工具包v1.60是这个项目的一个重要版本,包含了丰富的...

    (0051)-iOS/iPhone/iPAD/iPod源代码-地图(Map)-Customized Callout MKAnnotatio

    2. **扩展内容**: 在这个示例中,callout界面加入了列表等控件,这意味着用户可以直接在callout中查看和操作更多信息,而无需跳转到新的页面,提高了用户体验。 3. **回调函数**: 自定义callout通常需要监听用户的...

    MSDN Magazine, November 2012

    - Charles Petzold的“Assembling Bing Map Tiles on Windows Phone”展示了如何在Windows Phone上集成Bing地图瓦片,这对于地理位置相关的应用程序尤其有用。 - David Platt的“Don’t Get Me Started: Here We ...

Global site tag (gtag.js) - Google Analytics