How can I populate more than one Silverlight Image from Bing Maps asynchronous calls?
I have the following code, which works fine if you just want to populate one Image with a response from Bing Maps. But if I try to do two then the variable _currentImage always ends up being "image1" because the calls are asynchronous. How can I pass the image variable along to the ImageryServiceGetMapUriCompleted method?
using System;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using BasicBingMapsImagerySvc.ImageryService;
namespace BasicBingMapsImagerySvc
{
public partial class MainPage : UserControl
{
private const string BingMapsKey = "my key";
private Image _currentImage;
public MainPage()
{
InitializeComponent();
GetMap(42.573377, -101.032251, image0, MapStyle.AerialWithLabels);
GetMap(42.573377, -101.032251, image1, MapStyle.Road_v1);
}
private void GetMap(double lat, double lon, Image image, MapStyle mapStyle)
{
var mapUriRequest = new MapUriRequest();
// Set credentials using a valid Bing Maps key
mapUriRequest.Credentials = new Credentials();
mapUriRequest.Credentials.ApplicationId = BingMapsKey;
// Set the location of the requested image
mapUriRequest.Center = new Location();
mapUriRequest.Center.Latitude = lat;
mapUriRequest.Center.Longitude = lon;
// Set the map style and zoom level
开发者_如何学运维 var mapUriOptions = new MapUriOptions();
mapUriOptions.Style = mapStyle;
mapUriOptions.ZoomLevel = 13;
// Set the size of the requested image to match the size of the image control
mapUriOptions.ImageSize = new SizeOfint();
mapUriOptions.ImageSize.Height = 256;
mapUriOptions.ImageSize.Width = 256;
mapUriRequest.Options = mapUriOptions;
var imageryService = new ImageryServiceClient("BasicHttpBinding_IImageryService");
imageryService.GetMapUriCompleted += ImageryServiceGetMapUriCompleted;
_currentImage = image;
imageryService.GetMapUriAsync(mapUriRequest);
}
private void ImageryServiceGetMapUriCompleted(object sender, GetMapUriCompletedEventArgs e)
{
// The result is an MapUriResponse Object
MapUriResponse mapUriResponse = e.Result;
var bmpImg = new BitmapImage(new Uri(mapUriResponse.Uri));
_currentImage.Source = bmpImg;
}
}
}
You could use a lambda expression / delegate for your event handler, which allows you to 'capture' the reference to the image:
var imageryService = new ImageryServiceClient("BasicHttpBinding_IImageryService");
imageryService.GetMapUriCompleted += (s,e) =>
{
// The result is an MapUriResponse Object
MapUriResponse mapUriResponse = e.Result;
var bmpImg = new BitmapImage(new Uri(mapUriResponse.Uri));
// set the image source
image.Source = bmpImg;
};
精彩评论