diff --git a/Caching/FileDbCache.WPF/Properties/AssemblyInfo.cs b/Caching/FileDbCache.WPF/Properties/AssemblyInfo.cs index 2bffb890..72493d40 100644 --- a/Caching/FileDbCache.WPF/Properties/AssemblyInfo.cs +++ b/Caching/FileDbCache.WPF/Properties/AssemblyInfo.cs @@ -7,8 +7,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCopyright("© 2016 Clemens Fischer")] [assembly: AssemblyTrademark("")] -[assembly: AssemblyVersion("2.12.0")] -[assembly: AssemblyFileVersion("2.12.0")] +[assembly: AssemblyVersion(("2.13.0"))] +[assembly: AssemblyFileVersion(("2.13.0"))] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] diff --git a/Caching/FileDbCache.WinRT/Properties/AssemblyInfo.cs b/Caching/FileDbCache.WinRT/Properties/AssemblyInfo.cs index 2421817f..64e546f0 100644 --- a/Caching/FileDbCache.WinRT/Properties/AssemblyInfo.cs +++ b/Caching/FileDbCache.WinRT/Properties/AssemblyInfo.cs @@ -7,8 +7,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCopyright("© 2016 Clemens Fischer")] [assembly: AssemblyTrademark("")] -[assembly: AssemblyVersion("2.12.0")] -[assembly: AssemblyFileVersion("2.12.0")] +[assembly: AssemblyVersion(("2.13.0"))] +[assembly: AssemblyFileVersion(("2.13.0"))] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] diff --git a/Caching/ImageFileCache.WPF/Properties/AssemblyInfo.cs b/Caching/ImageFileCache.WPF/Properties/AssemblyInfo.cs index bbabcab8..08edc754 100644 --- a/Caching/ImageFileCache.WPF/Properties/AssemblyInfo.cs +++ b/Caching/ImageFileCache.WPF/Properties/AssemblyInfo.cs @@ -7,8 +7,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCopyright("© 2016 Clemens Fischer")] [assembly: AssemblyTrademark("")] -[assembly: AssemblyVersion("2.12.0")] -[assembly: AssemblyFileVersion("2.12.0")] +[assembly: AssemblyVersion(("2.13.0"))] +[assembly: AssemblyFileVersion(("2.13.0"))] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] diff --git a/Caching/ImageFileCache.WinRT/Properties/AssemblyInfo.cs b/Caching/ImageFileCache.WinRT/Properties/AssemblyInfo.cs index f6d77c81..46e4b988 100644 --- a/Caching/ImageFileCache.WinRT/Properties/AssemblyInfo.cs +++ b/Caching/ImageFileCache.WinRT/Properties/AssemblyInfo.cs @@ -7,8 +7,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCopyright("© 2016 Clemens Fischer")] [assembly: AssemblyTrademark("")] -[assembly: AssemblyVersion("2.12.0")] -[assembly: AssemblyFileVersion("2.12.0")] +[assembly: AssemblyVersion(("2.13.0"))] +[assembly: AssemblyFileVersion(("2.13.0"))] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] diff --git a/MapControl/MapBase.Silverlight.WinRT.cs b/MapControl/MapBase.Silverlight.WinRT.cs index 7b958650..459ca2ce 100644 --- a/MapControl/MapBase.Silverlight.WinRT.cs +++ b/MapControl/MapBase.Silverlight.WinRT.cs @@ -80,5 +80,10 @@ namespace MapControl viewportTransform.Matrix = transform; } + + private void SetTileLayer(TileLayer tileLayer) + { + TileLayer = tileLayer; + } } } diff --git a/MapControl/MapBase.WPF.cs b/MapControl/MapBase.WPF.cs index 4a704b00..095afd78 100644 --- a/MapControl/MapBase.WPF.cs +++ b/MapControl/MapBase.WPF.cs @@ -96,5 +96,10 @@ namespace MapControl viewportTransform.Matrix = transform; } + + private void SetTileLayer(TileLayer tileLayer) + { + SetCurrentValue(TileLayerProperty, tileLayer); + } } } diff --git a/MapControl/MapBase.cs b/MapControl/MapBase.cs index bb353ec9..48c6c4fc 100644 --- a/MapControl/MapBase.cs +++ b/MapControl/MapBase.cs @@ -465,13 +465,13 @@ namespace MapControl oldCollection.CollectionChanged -= TileLayerCollectionChanged; } - TileLayer = null; + SetTileLayer(null); ClearTileLayers(); } if (newTileLayers != null) { - TileLayer = newTileLayers.FirstOrDefault(); + SetTileLayer(newTileLayers.FirstOrDefault()); AddTileLayers(0, newTileLayers); var newCollection = newTileLayers as INotifyCollectionChanged; @@ -517,7 +517,7 @@ namespace MapControl if (TileLayer != tileLayer) { - TileLayer = tileLayer; + SetTileLayer(tileLayer); } } diff --git a/MapControl/Properties/AssemblyInfo.cs b/MapControl/Properties/AssemblyInfo.cs index a5f8acce..2ea4b04f 100644 --- a/MapControl/Properties/AssemblyInfo.cs +++ b/MapControl/Properties/AssemblyInfo.cs @@ -14,8 +14,8 @@ using System.Windows; [assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCopyright("© 2016 Clemens Fischer")] [assembly: AssemblyTrademark("")] -[assembly: AssemblyVersion("2.12.0")] -[assembly: AssemblyFileVersion("2.12.0")] +[assembly: AssemblyVersion(("2.13.0"))] +[assembly: AssemblyFileVersion(("2.13.0"))] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] diff --git a/MapControl/Tile.Silverlight.WinRT.cs b/MapControl/Tile.Silverlight.WinRT.cs index 10771bdf..3342cd3c 100644 --- a/MapControl/Tile.Silverlight.WinRT.cs +++ b/MapControl/Tile.Silverlight.WinRT.cs @@ -38,7 +38,7 @@ namespace MapControl } else { - Image.BeginAnimation(Image.OpacityProperty, + Image.BeginAnimation(UIElement.OpacityProperty, new DoubleAnimation { From = 0d, To = 1d, Duration = FadeDuration }); } } @@ -58,7 +58,7 @@ namespace MapControl bitmap.ImageOpened -= BitmapImageOpened; bitmap.ImageFailed -= BitmapImageFailed; - Image.BeginAnimation(Image.OpacityProperty, + Image.BeginAnimation(UIElement.OpacityProperty, new DoubleAnimation { From = 0d, To = 1d, Duration = FadeDuration }); } diff --git a/MapControl/Tile.WPF.cs b/MapControl/Tile.WPF.cs index 8bf70830..710cd3e0 100644 --- a/MapControl/Tile.WPF.cs +++ b/MapControl/Tile.WPF.cs @@ -3,6 +3,7 @@ // Licensed under the Microsoft Public License (Ms-PL) using System; +using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Media.Animation; @@ -29,7 +30,7 @@ namespace MapControl } else { - Image.BeginAnimation(Image.OpacityProperty, + Image.BeginAnimation(UIElement.OpacityProperty, new DoubleAnimation(0d, 1d, FadeDuration)); } } @@ -49,7 +50,7 @@ namespace MapControl bitmap.DownloadCompleted -= BitmapDownloadCompleted; bitmap.DownloadFailed -= BitmapDownloadFailed; - Image.BeginAnimation(Image.OpacityProperty, + Image.BeginAnimation(UIElement.OpacityProperty, new DoubleAnimation(0d, 1d, FadeDuration)); } diff --git a/MapControl/TileImageLoader.WPF.cs b/MapControl/TileImageLoader.WPF.cs index 27c93a84..7241da3e 100644 --- a/MapControl/TileImageLoader.WPF.cs +++ b/MapControl/TileImageLoader.WPF.cs @@ -179,14 +179,7 @@ namespace MapControl } } - if (image != null) - { - dispatcher.BeginInvoke(new Action((t, i) => t.SetImage(i)), tile, image); - } - else - { - tile.SetImage(null); - } + dispatcher.BeginInvoke(new Action((t, i) => t.SetImage(i)), tile, image); } Interlocked.Decrement(ref taskCount); @@ -245,16 +238,19 @@ namespace MapControl using (var response = (HttpWebResponse)request.GetResponse()) { - using (var responseStream = response.GetResponseStream()) - using (var memoryStream = new MemoryStream()) + if (response.Headers["X-VE-Tile-Info"] != "no-tile") // set by Bing Maps { - responseStream.CopyTo(memoryStream); - memoryStream.Seek(0, SeekOrigin.Begin); - image = ImageLoader.FromStream(memoryStream); - - if (cacheKey != null) + using (var responseStream = response.GetResponseStream()) + using (var memoryStream = new MemoryStream()) { - SetCachedImage(cacheKey, memoryStream, GetExpiration(response.Headers)); + responseStream.CopyTo(memoryStream); + memoryStream.Seek(0, SeekOrigin.Begin); + image = ImageLoader.FromStream(memoryStream); + + if (cacheKey != null) + { + SetCachedImage(cacheKey, memoryStream, GetExpiration(response.Headers)); + } } } } diff --git a/MapControl/TileImageLoader.WinRT.cs b/MapControl/TileImageLoader.WinRT.cs index ef480392..02e50b1e 100644 --- a/MapControl/TileImageLoader.WinRT.cs +++ b/MapControl/TileImageLoader.WinRT.cs @@ -9,7 +9,6 @@ using System.Diagnostics; using System.IO; using System.Threading; using System.Threading.Tasks; -using MapControl.Caching; using Windows.Storage; using Windows.Storage.Streams; using Windows.UI.Core; @@ -61,13 +60,11 @@ namespace MapControl { public readonly Tile Tile; public readonly Uri Uri; - public readonly BitmapSource Image; public PendingTile(Tile tile, Uri uri) { Tile = tile; Uri = uri; - Image = new BitmapImage(); } } @@ -140,22 +137,18 @@ namespace MapControl private async Task LoadPendingTiles(TileSource tileSource, string sourceName) { PendingTile pendingTile; - var cache = Cache; - if (cache == null || sourceName == null) + while (pendingTiles.TryDequeue(out pendingTile)) { - while (pendingTiles.TryDequeue(out pendingTile)) + var tile = pendingTile.Tile; + var uri = pendingTile.Uri; + + if (Cache == null || sourceName == null) { - await DownloadImage(pendingTile.Tile, pendingTile.Image, pendingTile.Uri, null); + await DownloadImage(tile, uri, null); } - } - else - { - while (pendingTiles.TryDequeue(out pendingTile)) + else { - var tile = pendingTile.Tile; - var image = pendingTile.Image; - var uri = pendingTile.Uri; var extension = Path.GetExtension(uri.LocalPath); if (string.IsNullOrEmpty(extension) || extension == ".jpeg") @@ -164,12 +157,12 @@ namespace MapControl } var cacheKey = string.Format(@"{0}\{1}\{2}\{3}{4}", sourceName, tile.ZoomLevel, tile.XIndex, tile.Y, extension); - var cacheItem = await cache.GetAsync(cacheKey); + var cacheItem = await Cache.GetAsync(cacheKey); var loaded = false; if (cacheItem == null || cacheItem.Expiration <= DateTime.UtcNow) { - loaded = await DownloadImage(tile, image, uri, cacheKey); + loaded = await DownloadImage(tile, uri, cacheKey); } if (!loaded && cacheItem != null && cacheItem.Buffer != null) @@ -180,7 +173,7 @@ namespace MapControl await stream.FlushAsync(); stream.Seek(0); - await LoadImageFromStream(tile, image, stream); + await LoadImageFromStream(tile, stream); } } } @@ -189,7 +182,7 @@ namespace MapControl Interlocked.Decrement(ref taskCount); } - private async Task DownloadImage(Tile tile, BitmapSource image, Uri uri, string cacheKey) + private async Task DownloadImage(Tile tile, Uri uri, string cacheKey) { try { @@ -198,7 +191,7 @@ namespace MapControl { if (response.IsSuccessStatusCode) { - return await LoadImageFromHttpResponse(response, tile, image, cacheKey); + return await LoadImageFromHttpResponse(response, tile, cacheKey); } Debug.WriteLine("{0}: {1} {2}", uri, (int)response.StatusCode, response.ReasonPhrase); @@ -212,8 +205,16 @@ namespace MapControl return false; } - private async Task LoadImageFromHttpResponse(HttpResponseMessage response, Tile tile, BitmapSource image, string cacheKey) + private async Task LoadImageFromHttpResponse(HttpResponseMessage response, Tile tile, string cacheKey) { + string tileInfo; + + if (response.Headers.TryGetValue("X-VE-Tile-Info", out tileInfo) && tileInfo == "no-tile") // set by Bing Maps + { + tile.SetImage(null); + return true; + } + using (var stream = new InMemoryRandomAccessStream()) { using (var content = response.Content) @@ -224,10 +225,9 @@ namespace MapControl await stream.FlushAsync(); stream.Seek(0); - var loaded = await LoadImageFromStream(tile, image, stream); - IImageCache cache; + var loaded = await LoadImageFromStream(tile, stream); - if (loaded && cacheKey != null && (cache = Cache) != null) + if (loaded && cacheKey != null) { var buffer = new Windows.Storage.Streams.Buffer((uint)stream.Size); @@ -246,23 +246,24 @@ namespace MapControl } } - await cache.SetAsync(cacheKey, buffer, DateTime.UtcNow.Add(expiration)); + await Cache.SetAsync(cacheKey, buffer, DateTime.UtcNow.Add(expiration)); } return loaded; } } - private async Task LoadImageFromStream(Tile tile, BitmapSource image, IRandomAccessStream stream) + private async Task LoadImageFromStream(Tile tile, IRandomAccessStream stream) { var completion = new TaskCompletionSource(); - var action = image.Dispatcher.RunAsync( + var action = tile.Image.Dispatcher.RunAsync( CoreDispatcherPriority.Normal, async () => { try { + var image = new BitmapImage(); await image.SetSourceAsync(stream); tile.SetImage(image, true, false); completion.SetResult(true); diff --git a/MapControl/WinRT/Properties/AssemblyInfo.cs b/MapControl/WinRT/Properties/AssemblyInfo.cs index d0aa7af7..007e7b6a 100644 --- a/MapControl/WinRT/Properties/AssemblyInfo.cs +++ b/MapControl/WinRT/Properties/AssemblyInfo.cs @@ -7,8 +7,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCopyright("© 2016 Clemens Fischer")] [assembly: AssemblyTrademark("")] -[assembly: AssemblyVersion("2.12.0")] -[assembly: AssemblyFileVersion("2.12.0")] +[assembly: AssemblyVersion(("2.13.0"))] +[assembly: AssemblyFileVersion(("2.13.0"))] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] diff --git a/SampleApps/PhoneApplication/Properties/AssemblyInfo.cs b/SampleApps/PhoneApplication/Properties/AssemblyInfo.cs index b415f914..3e543163 100644 --- a/SampleApps/PhoneApplication/Properties/AssemblyInfo.cs +++ b/SampleApps/PhoneApplication/Properties/AssemblyInfo.cs @@ -7,8 +7,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCopyright("© 2016 Clemens Fischer")] [assembly: AssemblyTrademark("")] -[assembly: AssemblyVersion("2.12.0")] -[assembly: AssemblyFileVersion("2.12.0")] +[assembly: AssemblyVersion(("2.13.0"))] +[assembly: AssemblyFileVersion(("2.13.0"))] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] diff --git a/SampleApps/SilverlightApplication.Web/Properties/AssemblyInfo.cs b/SampleApps/SilverlightApplication.Web/Properties/AssemblyInfo.cs index 25c6ed32..e9a70db8 100644 --- a/SampleApps/SilverlightApplication.Web/Properties/AssemblyInfo.cs +++ b/SampleApps/SilverlightApplication.Web/Properties/AssemblyInfo.cs @@ -7,8 +7,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCopyright("© 2016 Clemens Fischer")] [assembly: AssemblyTrademark("")] -[assembly: AssemblyVersion("2.12.0")] -[assembly: AssemblyFileVersion("2.12.0")] +[assembly: AssemblyVersion(("2.13.0"))] +[assembly: AssemblyFileVersion(("2.13.0"))] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] diff --git a/SampleApps/SilverlightApplication/Properties/AssemblyInfo.cs b/SampleApps/SilverlightApplication/Properties/AssemblyInfo.cs index 31940e65..56c8a00b 100644 --- a/SampleApps/SilverlightApplication/Properties/AssemblyInfo.cs +++ b/SampleApps/SilverlightApplication/Properties/AssemblyInfo.cs @@ -7,8 +7,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCopyright("© 2016 Clemens Fischer")] [assembly: AssemblyTrademark("")] -[assembly: AssemblyVersion("2.12.0")] -[assembly: AssemblyFileVersion("2.12.0")] +[assembly: AssemblyVersion(("2.13.0"))] +[assembly: AssemblyFileVersion(("2.13.0"))] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] diff --git a/SampleApps/UniversalApp/Properties/AssemblyInfo.cs b/SampleApps/UniversalApp/Properties/AssemblyInfo.cs index b440cef0..d3f5ab32 100644 --- a/SampleApps/UniversalApp/Properties/AssemblyInfo.cs +++ b/SampleApps/UniversalApp/Properties/AssemblyInfo.cs @@ -8,7 +8,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyCopyright("© 2016 Clemens Fischer")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -[assembly: AssemblyVersion("2.12.0")] -[assembly: AssemblyFileVersion("2.12.0")] +[assembly: AssemblyVersion(("2.13.0"))] +[assembly: AssemblyFileVersion(("2.13.0"))] [assembly: AssemblyConfiguration("")] [assembly: ComVisible(false)] diff --git a/SampleApps/WpfApplication/Properties/AssemblyInfo.cs b/SampleApps/WpfApplication/Properties/AssemblyInfo.cs index f29f3517..c49999f6 100644 --- a/SampleApps/WpfApplication/Properties/AssemblyInfo.cs +++ b/SampleApps/WpfApplication/Properties/AssemblyInfo.cs @@ -7,8 +7,8 @@ using System.Runtime.InteropServices; [assembly: AssemblyCompany("Clemens Fischer")] [assembly: AssemblyCopyright("© 2016 Clemens Fischer")] [assembly: AssemblyTrademark("")] -[assembly: AssemblyVersion("2.12.0")] -[assembly: AssemblyFileVersion("2.12.0")] +[assembly: AssemblyVersion(("2.13.0"))] +[assembly: AssemblyFileVersion(("2.13.0"))] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)]