Windows Phone 上的 Web 服务编程 已翻译 100%

曾沙 投递于 2012/11/27 17:03 (共 2 段, 翻译完成于 11-27)
阅读 240
收藏 0
0
加载中

移动设备现在紧密的跟互联网结合,开发者应该利用这个优势来开发各种网络服务,今天我们介绍在 Windows Phone 上开发 Web 服务应用。

环境要求:

因为这是一个 Windows Phone 应用,你需要安装 Visual Studio for Windows Phone Express installed  或者 Visual Studio 2010,可通过下面地址下载:

曾沙
翻译于 2012/11/27 17:05
1

关于应用:

这个应用使用微软的 Bing 地图来显示两点之间的路线以及距离,我们更多的在讲述 Web 服务的使用,至于地图接口可参考 Bing MapsBing Maps v2 ,以及一些入门文章 Bing Maps in Windows Phone

假设你已经将地图控件从工具箱中拖到了主界面,并在 ApplicationBar 处插入如下代码:

<phone:PhoneApplicationPage.ApplicationBar>
    <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True" Opacity="0.9">
        <shell:ApplicationBarIconButton IconUri="/Icons/plus.png" Text="Zoom In" Click="zoomIn_click"/>
        <shell:ApplicationBarIconButton IconUri="/Icons/minus.png" Text="Zoom out" Click="zoomOut_click"/>
        <shell:ApplicationBarIconButton IconUri="/Icons/A.png" Text="Aerial mode" Click="Aerial_click"/>
        <shell:ApplicationBarIconButton IconUri="/Icons/R.png" Text="Road mode" Click="Road_click"/>
        <shell:ApplicationBar.MenuItems>
            <shell:ApplicationBarMenuItem Text="Choose my position" Click="chooseMyPosition_click"/>
            <shell:ApplicationBarMenuItem Text="Locate Me" Click="locateMe_click"/>
            <shell:ApplicationBarMenuItem Text="Set Pushpin" Click="setPin_click"/>
            <shell:ApplicationBarMenuItem Text="Add Pushpin" Click="addPin_click"/>
            <shell:ApplicationBarMenuItem Text="Show Route" Click="showRoute_click"/>
        </shell:ApplicationBar.MenuItems>
    </shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>

接下来使用如下代码来引入地图特性:

using Microsoft.Phone.Controls;
using Microsoft.Phone.Controls.Maps;
using System.Device.Location;

然后编写代码:

//declaring the two Pushpins and the Polyline
Pushpin pin1 = new Pushpin();
Pushpin pin2 = new Pushpin();
MapPolyline poly = new MapPolyline(); 

在地图上显示折线:

//Initialization for polyline
poly.Locations = new LocationCollection();
poly.Opacity = 1.0;
poly.StrokeThickness = 3;
SolidColorBrush mySolidColorBrush = new SolidColorBrush();
mySolidColorBrush.Color = Colors.Green;
poly.Stroke = mySolidColorBrush; 


现在我们要开始使用 Web 服务,首先右击项目并选择 Add Service Reference:

在地址栏中粘贴下面 web 服务地址:

http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc/mex

点击 Go 后,该服务将出现在 Services 域中:

当点击 OK 按钮后,你项目里将生成一些文件,因此我们可以通过如下代码来使用这个服务:

private void showRoute_click(object sender, EventArgs e)
{
    //creating the reference to the service
    ServiceReference1.RouteServiceClient proxy = 
      new ServiceReference1.RouteServiceClient("BasicHttpBinding_IRouteService");
    ServiceReference1.RouteRequest rr = new ServiceReference1.RouteRequest();
    
    //this service requires a key
    rr.Credentials = new ServiceReference1.Credentials();
    rr.Credentials.ApplicationId = 
        "Asa2x7ZzhYIHauji6TzIkcf3TIDznTgBaPKQehsyE4taOz19Mx4fP4lyihqbTj7D";
    rr.Options = new ServiceReference1.RouteOptions();
    rr.Options.RoutePathType = ServiceReference1.RoutePathType.Points;

    //declaring the two points
    ServiceReference1.Waypoint wp1 = new ServiceReference1.Waypoint();
    ServiceReference1.Waypoint wp2 = new ServiceReference1.Waypoint();

    //the first location is my location (from)
    wp1.Location = new ServiceReference1.Location();
    wp1.Location.Latitude = SharedInformation.myLatitude;
    wp1.Location.Longitude = SharedInformation.myLongitude;
    wp1.Description = "";
    //the second location is the destination (to)
    wp2.Location = new ServiceReference1.Location();
    wp2.Location.Latitude = SharedInformation.pinLat;
    wp2.Location.Longitude = SharedInformation.pinLong;
    wp2.Description = "";

    //setting the parameter to send
    rr.Waypoints = new System.Collections.ObjectModel.ObservableCollection<ServiceReference1.Waypoint>();
    rr.Waypoints.Add(wp1);
    rr.Waypoints.Add(wp2);

    //invoking the web service
    proxy.CalculateRouteAsync(rr);
    proxy.CalculateRouteCompleted += 
      new EventHandler<ServiceReference1.CalculateRouteCompletedEventArgs>(proxy_CalculateRouteCompleted);  
}


这里非常重要的是 Windows Phone 是通过异步的方式来调用 Web 服务,这也是为什么方法名添加了 Async 表达式,这是为了让 UI 被操作堵塞。

IntelliSence 可帮你显示 Web 服务中提供的不同的方法,以及方法的参数:

来自 Web 服务的返回结果是通过第二个参数proxy_CalculateRouteCompleted来返回的,这个参数是一个方法,在调用 Web 服务有返回后这个方法将被调用,结果是一系列的点阵,我们可利用这些点阵来画线:

public void proxy_CalculateRouteCompleted(object obj, ServiceReference1.CalculateRouteCompletedEventArgs e)
{
    try
    {
        foreach (ServiceReference1.Location location in e.Result.Result.RoutePath.Points)
        {

            poly.Locations.Add(new GeoCoordinate(location.Latitude, location.Longitude));
        }

        //add the Polyline to the Map
        map1.Children.Add(poly);
        
        //display the distance between the two Pushpins
        pin2.Content = "It's " + e.Result.Result.Summary.Distance.ToString() + "Km far away!";
    }
    catch (Exception exc)
    {
        MessageBox.Show(exc.Message);
    }
}


使用 try-catch 的原因是调用服务可能发生异常,例如返回的点远离路径之类的。

下图是此 app 最终运行的截图:

绘制的路线图如下:

  

全文完,希望你喜欢这篇文章。

本文完整代码下载:http://www.oschina.net/code/snippet_12_12794

曾沙
翻译于 2012/11/27 17:04
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(0)

返回顶部
顶部