信息
您所需的主题如下所示。但此主题未包含在此库中。

如何在 Windows Phone 8 中的地图上显示路线和方向

2014/6/18

仅适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1

本主题介绍如何显示从手机的当前位置到 Windows Phone 8 地图中的指定位置的路线和方向。

提示提示:

本主题介绍如何编写用于在应用中显示路线和方向的代码。如果只想显示路线,您也可以使用地图路线任务,它将启动内置地图应用。有关详细信息,请参阅如何使用 Windows Phone 8 的地图路线任务

考虑添加文本到语音转换输出的可能性。有关更多信息,请参见 Windows Phone 8 的文本到语音转换 (TTS)

本主题包括以下部分。

获取手机的当前位置的步骤

  1. 在 Visual Studio 中创建新的 Windows Phone 8 项目。

  2. 在应用清单文件中选择 ID_CAP_LOCATION 和 ID_CAP_MAP 功能。

    1. “解决方案资源管理器”中,展开 C# 项目中的“Properties”文件夹或 Visual Basic 项目中的“My Project”文件夹。在 Visual Basic 项目中,在展开“My Project”文件夹之前,可能需要单击“显示所有文件”

    2. 在展开的文件夹中,查找并打开应用清单文件 WMAppManifest.xml。

    3. “清单设计器”“功能”页面上,检查 ID_CAP_LOCATION 和 ID_CAP_MAP 功能。

    4. 保存您的更改并关闭“清单设计器”

  3. MainPage.xaml.csMainPage.xaml.vb 中,将默认代码替换为以下代码。此代码将获取手机的当前位置,并将手机的当前位置坐标添加到 MyCoordinates 集合。

    using System;
    using System.Collections.Generic;
    using System.Windows;
    using Microsoft.Phone.Controls;
    using System.Device.Location;
    using Windows.Devices.Geolocation;
    using Microsoft.Phone.Maps.Services;
    using Microsoft.Phone.Maps.Controls;
    
    namespace RouteDirectionsTopic
    {
        public partial class MainPage : PhoneApplicationPage
        {
            List<GeoCoordinate> MyCoordinates = new List<GeoCoordinate>();
    
            // Constructor
            public MainPage()
            {
                InitializeComponent();
                this.GetCoordinates();
            }
    
            private async void GetCoordinates()
            {
                // Get the phone's current location.
                Geolocator MyGeolocator = new Geolocator();
                MyGeolocator.DesiredAccuracyInMeters = 5;
                Geoposition MyGeoPosition = null;
                try
                {
                    MyGeoPosition = await MyGeolocator.GetGeopositionAsync(TimeSpan.FromMinutes(1), TimeSpan.FromSeconds(10));
                    MyCoordinates.Add(new GeoCoordinate(MyGeoPosition.Coordinate.Latitude, MyGeoPosition.Coordinate.Longitude));
                }
                catch (UnauthorizedAccessException)
                {
                    MessageBox.Show("Location is disabled in phone settings or capabilities are not checked.");
                }
                catch (Exception ex)
                {
                    // Something else happened while acquiring the location.
                    MessageBox.Show(ex.Message);
                }
            }
        }
    }
    

此代码示例将手机的当前位置坐标作为搜索提示提供给查找目的地的查询。手机的当前位置假定为华盛顿雷德蒙德市,此地距指定目的地(华盛顿西雅图市)不远。

显示从手机的当前位置到地图中某一位置的路线的步骤

  1. MainPage.xaml 中名为 ContentPanel 的网格内添加 Map 控件,如以下代码所示。有关添加 Map 控件的详细信息,请参见如何将地图控件添加到 Windows Phone 8 中的页面

    <maps:Map x:Name="MyMap" Grid.Row="1" Center="47.6268, -122.2460" ZoomLevel="11"/>
    

    如果您通过编写 XAML 添加控件,您还需要将以下 xmlns 声明添加到 phone:PhoneApplicationPage 元素。如果您从工具箱拖放地图控件,将自动添加此声明。

    xmlns:maps="clr-namespace:Microsoft.Phone.Maps.Controls;assembly=Microsoft.Phone.Maps"
    
    
  2. MainPage.xaml.csMainPage.xaml.vbMainPage 类中,创建以下类级变量。

            RouteQuery MyQuery = null;
            GeocodeQuery Mygeocodequery = null;
    
    
  3. GetCoordinates() 方法的 try 块中的代码后,添加以下代码。此代码将用户输入的目的地地址设置为 GeocodeQuerySearchTerm,然后将该地址转换为地理坐标。此后,该代码将这些地理坐标设置为 GeocodeQueryGeoCoordinate

                    Mygeocodequery = new GeocodeQuery();
                    Mygeocodequery.SearchTerm = "Seattle, WA";
                    Mygeocodequery.GeoCoordinate = new GeoCoordinate(MyGeoPosition.Coordinate.Latitude, MyGeoPosition.Coordinate.Longitude);
    
    
  4. GetCoordinates() 方法的 try 块中的代码后,添加以下代码。此代码将名为 Mygeocodequery_QueryCompleted 的事件处理程序附加到 QueryCompleted 事件,并调用 GeocodeQueryQueryAsync 方法。

                    Mygeocodequery.QueryCompleted += Mygeocodequery_QueryCompleted;
                    Mygeocodequery.QueryAsync();
    
    
  5. 向类中添加 Mygeocodequery_QueryCompleted 事件处理程序。此代码创建一个新的 RouteQuery 对象,并将当前位置和指定目的地的坐标存储在 RouteQueryWaypoints 属性中。它还将名为 MyQuery_QueryCompleted 的事件处理程序附加到 RouteQueryQueryCompleted 事件。

            void Mygeocodequery_QueryCompleted(object sender, QueryCompletedEventArgs<IList<MapLocation>> e)
            {
                if (e.Error == null)
                {
                    MyQuery = new RouteQuery();
                    MyCoordinates.Add(e.Result[0].GeoCoordinate);
                    MyQuery.Waypoints = MyCoordinates;
                    MyQuery.QueryCompleted += MyQuery_QueryCompleted;
                    MyQuery.QueryAsync();
                    Mygeocodequery.Dispose();
                }
            }
    
    
  6. 向类中添加 MyQuery_QueryCompleted 事件处理程序。此代码将在地图上 MyCoordinates 中的两个地理坐标对象之间添加路线。

            void MyQuery_QueryCompleted(object sender, QueryCompletedEventArgs<Route> e)
            {
                if (e.Error == null)
                {
                    Route MyRoute = e.Result;
                    MapRoute MyMapRoute = new MapRoute(MyRoute);
                    MyMap.AddRoute(MyMapRoute);
                    MyQuery.Dispose();
                }
            }
    
    

显示从手机的当前位置到地图中某一位置的方向的步骤

  1. MainPage.xaml 中,删除名为 LayoutRoot 的整个网格,并将其替换为以下代码。此代码将在地图控件下方添加 LongListSelector 控件,以显示两个位置之间的方向。

    
    <phone:PhoneApplicationPage.Resources>
       <DataTemplate x:Key="RouteListTemplate">
          <TextBlock Text="{Binding}" FontSize="{StaticResource PhoneFontSizeMedium}" Margin="5,5,0,0"/>
       </DataTemplate>
    </phone:PhoneApplicationPage.Resources>
        
    <!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
       <Grid.RowDefinitions>
          <RowDefinition Height="auto"/>
          <RowDefinition Height="*"/>
          <RowDefinition Height="auto"/>
          <RowDefinition Height="*"/>
       </Grid.RowDefinitions>
       <TextBlock Text="Map Route" Grid.Row="0" FontSize="{StaticResource PhoneFontSizeLarge}" Margin="0,0,0,20"/>
       <maps:Map x:Name="MyMap" Grid.Row="1" Center="47.6268, -122.2460" ZoomLevel="11"/>
       <TextBlock Text="Route Directions" Grid.Row="2" FontSize="{StaticResource PhoneFontSizeLarge}" Margin="0,10,0,20"/>
       <phone:LongListSelector x:Name="RouteLLS" Grid.Row="3" Background="Transparent" ItemTemplate="{StaticResource RouteListTemplate}" LayoutMode="List" 
          IsGroupingEnabled="False"/>
    </Grid>
    

    在添加此 XAML 代码后,下面是设计器中显示的内容。

    New layout of the controls in the designer
  2. MainPage.csMainPage.xaml.vb 中,将突出显示的代码添加到 MyQuery_QueryCompleted 事件处理程序,以显示两个位置之间的路线。

            void MyQuery_QueryCompleted(object sender, QueryCompletedEventArgs<Route> e)
            {
                if (e.Error == null)
                {
                    Route MyRoute = e.Result;
                    MapRoute MyMapRoute = new MapRoute(MyRoute);
                    MyMap.AddRoute(MyMapRoute);
    
                    List<string> RouteList = new List<string>();
                    foreach (RouteLeg leg in MyRoute.Legs)
                    {
                        foreach (RouteManeuver maneuver in leg.Maneuvers)
                        {
                            RouteList.Add(maneuver.InstructionText);
                        }
                    }
    
                    RouteLLS.ItemsSource = RouteList;
    
                    MyQuery.Dispose();
                }
            }
    
    

以下屏幕截图显示运行您已在本主题中创建的示例的结果。

确保在测试应用的设备上启用“设置”中的“位置”

Route and Directions in a Map control

显示: