To reproduce: add a RadMap with a Bing provider, select the canvas "Aerial with labels on demand" and zoom in all the way. It always gets the following exception:
System.ArgumentException: Parameter is not valid.
at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData)
at Telerik.WinControls.UI.MapTileDownloader.TileDownloadDataCompleted(Object sender, DownloadDataCompletedEventArgs e)
at System.Net.WebClient.OnDownloadDataCompleted(DownloadDataCompletedEventArgs e)
The issue is reproducible in Demo application with the Bing examples.
Workaround:
public RadForm1()
{
InitializeComponent();
string cacheFolder = @"..\..\cache";
BingRestMapProvider bingProvider = new Telerik.WinControls.UI.BingRestMapProvider();
bingProvider.TileDownloader = new CustomMapTileDownloader();
bingProvider.UseSession = true;
bingProvider.BingKey = "your bing key";
LocalFileCacheProvider cache = new LocalFileCacheProvider(cacheFolder);
bingProvider.CacheProvider = cache;
this.radMap1.Providers.Add(bingProvider);
}
public class CustomMapTileDownloader : MapTileDownloader
{
protected override void TileDownloadDataCompleted(object sender, System.Net.DownloadDataCompletedEventArgs e)
{
TileInfo tileInfo = ((TileInfo)e.UserState);
if (e.Error == null)
{
try
{
using (MemoryStream ms = new MemoryStream(e.Result))
{
Image img = Image.FromStream(ms, true, true);
tileInfo.Content = e.Result;
this.OnTileDownloadComplete(new TileInfoEventArgs(tileInfo));
lock (this.webClientsPoolLockObject)
{
this.webClientsPool[tileInfo.Quadkey].DownloadDataCompleted -= this.TileDownloadDataCompleted;
this.webClientsPool.Remove(tileInfo.Quadkey);
this.webRequestCache.Remove(tileInfo.Quadkey);
}
}
}
catch (Exception)
{
}
}
else
{
if (this.ShouldRetryDownload(e.Error))
{
Uri uri = this.webRequestCache[tileInfo.Quadkey];
lock (this.webClientsPoolLockObject)
{
uri = new Uri(this.webClientsPool[tileInfo.Quadkey].BaseAddress);
this.webClientsPool[tileInfo.Quadkey].DownloadDataCompleted -= this.TileDownloadDataCompleted;
this.webClientsPool.Remove(tileInfo.Quadkey);
this.webRequestCache.Remove(tileInfo.Quadkey);
}
this.BeginDownloadTile(uri, tileInfo);
}
}
}
}
}