void OnSliderValueChanged(object sender, RoutedPropertyChangedEventArgs <double> e) { scaleTransform.ScaleX = e.NewValue; scaleTransform.ScaleY = e.NewValue; var centerOfViewport = new Point(TerritoryScroll.ViewportWidth / 2, TerritoryScroll.ViewportHeight / 2); lastCenterPositionOnTarget = TerritoryScroll.TranslatePoint(centerOfViewport, TerritoryCanvas); }
void OnTerritoryScrollScrollChanged(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(TerritoryScroll.ViewportWidth / 2, TerritoryScroll.ViewportHeight / 2); Point centerOfTargetNow = TerritoryScroll.TranslatePoint(centerOfViewport, TerritoryCanvas); targetBefore = lastCenterPositionOnTarget; targetNow = centerOfTargetNow; } } else { targetBefore = lastMousePositionOnTarget; targetNow = Mouse.GetPosition(TerritoryCanvas); 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 / TerritoryCanvas.Width; double multiplicatorY = e.ExtentHeight / TerritoryCanvas.Height; double newOffsetX = TerritoryScroll.HorizontalOffset - dXInTargetPixels * multiplicatorX; double newOffsetY = TerritoryScroll.VerticalOffset - dYInTargetPixels * multiplicatorY; if (double.IsNaN(newOffsetX) || double.IsNaN(newOffsetY)) { return; } TerritoryScroll.ScrollToHorizontalOffset(newOffsetX); TerritoryScroll.ScrollToVerticalOffset(newOffsetY); } } }