private void MapScaleSlider_OnValueChanged(object sender, RoutedPropertyChangedEventArgs <double> e) { MapGridScaleTransform.ScaleX = e.NewValue; MapGridScaleTransform.ScaleY = e.NewValue; var centerOfViewport = new Point(MapScrollViewer.ViewportWidth / 2, MapScrollViewer.ViewportHeight / 2); _lastCenterPositionOnTarget = MapScrollViewer.TranslatePoint(centerOfViewport, MapGrid); }
private void MapScrollViewer_OnScrollChanged(object sender, ScrollChangedEventArgs e) { if (e.ExtentHeightChange != 0 || e.ExtentWidthChange != 0) { Point?targetBefore = null; Point?targetNow = null; if (!_lastMousePositionOnTarget.HasValue) { if (_lastCenterPositionOnTarget.HasValue) { var centerOfViewport = new Point(MapScrollViewer.ViewportWidth / 2, MapScrollViewer.ViewportHeight / 2); Point centerOfTargetNow = MapScrollViewer.TranslatePoint(centerOfViewport, MapGrid); targetBefore = _lastCenterPositionOnTarget; targetNow = centerOfTargetNow; } } else { targetBefore = _lastMousePositionOnTarget; targetNow = Mouse.GetPosition(MapGrid); _lastMousePositionOnTarget = null; } if (targetBefore.HasValue) { double dXInTargetPixels = targetNow.Value.X - targetBefore.Value.X; double dYInTargetPixels = targetNow.Value.Y - targetBefore.Value.Y; double multiplicatorX = e.ExtentWidth / MapGrid.Width; double multiplicatorY = e.ExtentHeight / MapGrid.Height; double newOffsetX = MapScrollViewer.HorizontalOffset - dXInTargetPixels * multiplicatorX; double newOffsetY = MapScrollViewer.VerticalOffset - dYInTargetPixels * multiplicatorY; if (double.IsNaN(newOffsetX) || double.IsNaN(newOffsetY)) { return; } MapScrollViewer.ScrollToHorizontalOffset(newOffsetX); MapScrollViewer.ScrollToVerticalOffset(newOffsetY); } } }