diff --git a/MapControl/Shared/MapTileLayer.cs b/MapControl/Shared/MapTileLayer.cs index 9849df10..b6e129a4 100644 --- a/MapControl/Shared/MapTileLayer.cs +++ b/MapControl/Shared/MapTileLayer.cs @@ -65,7 +65,7 @@ namespace MapControl public TileMatrix TileMatrix { get; private set; } - public List Tiles { get; } = new List(); + public IReadOnlyCollection Tiles { get; private set; } = new List(); /// /// Minimum zoom level supported by the MapTileLayer. Default value is 0. @@ -129,7 +129,7 @@ namespace MapControl { if (TileSource != TileImageLoader.TileSource) { - Tiles.Clear(); + Tiles = new List(); update = true; } @@ -144,13 +144,6 @@ namespace MapControl { UpdateTiles(); - Children.Clear(); - - foreach (var tile in Tiles) - { - Children.Add(tile.Image); - } - return TileImageLoader.LoadTiles(Tiles, TileSource, SourceName); } @@ -201,25 +194,17 @@ namespace MapControl private void UpdateTiles() { + var newTiles = new List(); int maxZoomLevel; - if (TileSource == null || - TileMatrix == null || - (maxZoomLevel = Math.Min(TileMatrix.ZoomLevel, MaxZoomLevel)) < MinZoomLevel) - { - Tiles.Clear(); - } - else + if (TileSource != null && + TileMatrix != null && + (maxZoomLevel = Math.Min(TileMatrix.ZoomLevel, MaxZoomLevel)) >= MinZoomLevel) { var minZoomLevel = IsBaseMapLayer ? Math.Max(TileMatrix.ZoomLevel - MaxBackgroundLevels, MinZoomLevel) : maxZoomLevel; - var oldTiles = Tiles.Where(t => t.ZoomLevel >= minZoomLevel && t.ZoomLevel <= maxZoomLevel).ToList(); - var newTiles = new List(); - - Tiles.Clear(); - for (var z = minZoomLevel; z <= maxZoomLevel; z++) { var tileSize = 1 << (TileMatrix.ZoomLevel - z); @@ -232,13 +217,13 @@ namespace MapControl { for (var x = x1; x <= x2; x++) { - var tile = oldTiles.FirstOrDefault(t => t.ZoomLevel == z && t.X == x && t.Y == y); + var tile = Tiles.FirstOrDefault(t => t.ZoomLevel == z && t.X == x && t.Y == y); if (tile == null) { tile = new Tile(z, x, y); - var equivalentTile = oldTiles.FirstOrDefault( + var equivalentTile = Tiles.FirstOrDefault( t => t.ZoomLevel == z && t.XIndex == tile.XIndex && t.Y == y && !t.Pending); if (equivalentTile != null) @@ -247,11 +232,20 @@ namespace MapControl } } - Tiles.Add(tile); + newTiles.Add(tile); } } } } + + Tiles = newTiles; + + Children.Clear(); + + foreach (var tile in Tiles) + { + Children.Add(tile.Image); + } } } }