最后,请注意上面的foreach循环中的最后一句,它调用了另一个方法Search。这个方法负责搜索飞机场位置信息。下面给出这个方法的相应代码:
public void Search(string id)
{
if (_geoservice == null)
{
_geoservice = new geoService.GeocodeServiceClient(
"BasicHttpBinding_IGeocodeService");
_geoservice.GeocodeCompleted += new EventHandler<
geoService.GeocodeCompletedEventArgs>(service_GeocodeCompleted);
}
_geocodeRequest.Query = id;
_geoservice.GeocodeAsync(_geocodeRequest);
}
{
if (_geoservice == null)
{
_geoservice = new geoService.GeocodeServiceClient(
"BasicHttpBinding_IGeocodeService");
_geoservice.GeocodeCompleted += new EventHandler<
geoService.GeocodeCompletedEventArgs>(service_GeocodeCompleted);
}
_geocodeRequest.Query = id;
_geoservice.GeocodeAsync(_geocodeRequest);
}
该方法首先确定一下geoservice服务没有运行其他的实例,以避免不必要的编码及内存消耗。如果条件成立,那么该方法创建服务的一个实例并传递进一个高级参数—BasicHttpBinding_IGeocodeService(有关细节请参考添加服务自动生成的文件Reference.cs及MSDN中的Bing Map SDK)。然后订阅服务的GeocodeCompleted事件。最后,通过调用服务的GeocodeAsync方法并传递进适当的参数启动对于WCF服务的异步调用。
下面,我们继续讨论处理上述异步调用返回结果的代码。
private void service_GeocodeCompleted(object sender, geoService.GeocodeCompletedEventArgs e)
{
if (e.Result.ResponseSummary.StatusCode ==
geoService.ResponseStatusCode.Success)
{
if (e.Result.Results[0].EntityType == "Airport")
{
var airport = Airports.Where(p => p.Name ==
e.Result.Results[0].DisplayName).FirstOrDefault();
airport.Location = e.Result.Results[0].Locations[0];
}
}
}
{
if (e.Result.ResponseSummary.StatusCode ==
geoService.ResponseStatusCode.Success)
{
if (e.Result.Results[0].EntityType == "Airport")
{
var airport = Airports.Where(p => p.Name ==
e.Result.Results[0].DisplayName).FirstOrDefault();
airport.Location = e.Result.Results[0].Locations[0];
}
}
}
如果返回条件满足并且调用成功(返回结果为Airport类型),那么我们搜索前面创建的字典以便找到与服务返回中名称一致的飞机场数据。此后,使用最新信息修改对应机场的位置信息。
最后,我们来看一下应用程序整体初始化情况。
public MainPage()
{
InitializeComponent();
Airports = new List<Airport>();
GetAirports();
lstbAirports.ItemsSource = Airports; uiElements
}
{
InitializeComponent();
Airports = new List<Airport>();
GetAirports();
lstbAirports.ItemsSource = Airports; uiElements
}
现在,再次运行应用程序,你会观察到一个类似于图5的结果快照。
图5. 通过Bing提供的WCF地理信息服务启动的应用程序快照。
三、小结
在本篇中,我们讨论了创建一个操作Bing Maps Silverlight地图控件的基本应用的前期工作,并且能够初步使用Bing提供的WCF地理信息服务。在下一篇中,我们将继续探讨Bing服务编程知识并进一步扩展应用程序使之支持浏览器外运行功能。