技术开发 频道

无处可逃!Silverlight实现BingMap定位

 接下来,我们还要编写另一个方法GetDescription以便请求适当的RSS回馈信息:

private void GetDescription(string search)
  {
        WebClient client
= new WebClient();
        client.DownloadStringCompleted
+= new DownloadStringCompletedEventHandler(
        client_DownloadStringCompleted);
        
string url = "http://www.airportfact.com/feeds/airport/" + search;
        client.DownloadStringAsync(
new Uri(url));
  }

   上述GetDescription方法打开我们感兴趣的RSS回馈信息所在的顶层URL位置,并检索指定通过列表框选择的代码相应的机场的标题信息。注意,因为我们把程序修改为浏览器外运行,所以,上述以异步方式调用跨域中的RSS数据是完全没有问题的。

  接下来,我们还要编写上面的事件处理器方法client_DownloadStringCompleted,以便处理返回的RSS信息并将其添加到上面创建的地图控件中:

private void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) {
        
if (e.Error == null)
    {
          XDocument doc
= XDocument.Parse(e.Result);
          var item
= doc.Elements("rss").Elements("channel").Elements("item")
          .FirstOrDefault();
          var airport
= Airports.Where(p => p.ID == item.Element("title")
          .Value.Substring(
0, 3)).FirstOrDefault();
          try
      {
            ToolTipService.SetToolTip(uiElements[airport], ReplaceHTMLChars(
            item.Element(
"description").Value));
      }
          catch (Exception)
      {
      }
    }
  }

   这个client_DownloadStringCompleted事件处理器负责从返回的XML列表中检索特定机场信息,并更新此飞机场的当前属性值。

  为了调用包含在方法GetDescription (string search)中的服务,请切换到_geoservice_GeocodeCompleted方法,并注意观察在下面语句的后面的内容:

airport.Location e.Result.Results = [ 0]. Locations [0]

   正是调用了GetDescription方法,并把飞机场ID属性信息以参数传递过去:

GetDescription (airport.ID)

   下图给出了本文示例最终的某一运行时快照。图中,当用户单击下拉列表框中的某一个飞机场代码时并把鼠标停放在相应的小旗标记上时,对应的提示信息即显示于当前位置。

1

  图4.最终版本的示例程序运行时某一快照。

 

  五、结论

  其实,本文中仅仅涉及到了Bing Maps及其提供的服务的开发一个Silverlight 4应用程序最基本的内容,读者可以把它作为有关这些内容编程的一个入门级教程。然而,你也看到了,如果结合更复杂的多数据源操作和多图层操作以及更细致具体的地图数据提供,你完全可以把本文实例扩展成一个企业级应用的核心模块。


      代码下载:UserFiles/File/SL4BingMashup.rar

0
相关文章