public static void Render(Viewport viewport, Canvas canvas, IEnumerable<Tile<Image>> tiles) { if (viewport == null) return; canvas.Children.Clear(); var tileList = tiles.ToList(); for (int i = 0; i < tileList.Count; i++) { var tile = tileList[i]; if (tile.Image == null) continue; var point1 = viewport.WorldToScreen(tile.Info.Extent.MinX, tile.Info.Extent.MaxY); var point2 = viewport.WorldToScreen(tile.Info.Extent.MaxX, tile.Info.Extent.MinY); var dest = new Rect(point1.ToMetroPoint(), point2.ToMetroPoint()); dest = RoundToPixel(dest); Canvas.SetLeft(tile.Image, dest.X); Canvas.SetTop(tile.Image, dest.Y); tile.Image.Width = dest.Width; tile.Image.Height = dest.Height; canvas.Children.Add(tile.Image); if (tile.StartAnimation == default(long)) { tile.StartAnimation = DateTime.Now.Ticks; Animate(tile.Image, "Opacity", 0, 1, 600, (s, e) => { }); } } }
public static void PositionImage(Image image, Extent extent, Viewport viewport) { var min = viewport.WorldToScreen(extent.MinX, extent.MinY); var max = viewport.WorldToScreen(extent.MaxX, extent.MaxY); Canvas.SetLeft(image, min.X); Canvas.SetTop(image, max.Y); image.Width = max.X - min.X; image.Height = min.Y - max.Y; }
public void Render(Viewport viewport, ITileSource tileSource, ITileCache<Tile<Image>> tileCache) { _canvas.Children.Clear(); var level = Utilities.GetNearestLevel(tileSource.Schema.Resolutions, viewport.UnitsPerPixel); var tileInfos = tileSource.Schema.GetTileInfos(viewport.Extent, level); foreach (var tileInfo in tileInfos) { var tile = tileCache.Find(tileInfo.Index); if (tile != null) { _canvas.Children.Add(tile.Image); PositionImage(tile.Image, tileInfo.Extent, viewport); } } }
void MapControlSizeChanged(object sender, SizeChangedEventArgs e) { if (_viewport == null) { if (CanInitializeViewport(ActualWidth, ActualHeight)) { _viewport = InitializeViewport(ActualWidth, ActualHeight, FullMapExtent); _fetcher.ViewChanged(_viewport.Extent, _viewport.Resolution); } } else { _viewport.Width = e.NewSize.Width; _viewport.Height = e.NewSize.Height; _fetcher.ViewChanged(_viewport.Extent, _viewport.Resolution); } InvalidateArrange(); }
private static bool TryInitializeViewport(ref Viewport viewport, double actualWidth, double actualHeight, ITileSchema schema) { if (double.IsNaN(actualWidth)) return false; if (actualWidth <= 0) return false; var nearestLevel = Utilities.GetNearestLevel(schema.Resolutions, schema.Extent.Width / actualWidth); viewport = new Viewport { Width = actualWidth, Height = actualHeight, Resolution = schema.Resolutions[nearestLevel].UnitsPerPixel, Center = new Samples.Common.Geometries.Point(schema.Extent.CenterX, schema.Extent.CenterY) }; return true; }