private void ToolBox_MouseDown(object sender, MouseButtonEventArgs e) { Label lb = sender as Label; switch (lb.Content) { case "Move": this.isMoveMode = !isMoveMode; break; case "Zoom in": if (Zoom <= 2) { Zoom += .05; scaleTransform.ScaleX = Zoom; scaleTransform.ScaleY = Zoom; var centerOfViewport = new Point(MainScrollViewer.ViewportWidth / 2, MainScrollViewer.ViewportHeight / 2); lastCenterPositionOnTarget = MainScrollViewer.TranslatePoint(centerOfViewport, GridWorkspace); if (!lbZoomOut.IsEnabled) { lbZoomOut.IsEnabled = true; lbZoomOut.Foreground = Brushes.White; } } else { lb.IsEnabled = false; } break; case "Zoom out": if (Zoom > 0.3) { Zoom -= .05; scaleTransform.ScaleX = Zoom; scaleTransform.ScaleY = Zoom; var centerOfViewport1 = new Point(MainScrollViewer.ViewportWidth / 2, MainScrollViewer.ViewportHeight / 2); lastCenterPositionOnTarget = MainScrollViewer.TranslatePoint(centerOfViewport1, GridWorkspace); } else { lb.IsEnabled = false; } break; } lbZoomRatio.Content = (Zoom * 100).ToString() + "%"; }
void OnScrollViewerScrollChanged(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(MainScrollViewer.ViewportWidth / 2, MainScrollViewer.ViewportHeight / 2); Point centerOfTargetNow = MainScrollViewer.TranslatePoint(centerOfViewport, MainCanvas); targetBefore = lastCenterPositionOnTarget; targetNow = centerOfTargetNow; } } else { targetBefore = lastMousePositionOnTarget; targetNow = Mouse.GetPosition(MainCanvas); 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 / MainCanvas.Width; double multiplicatorY = e.ExtentHeight / MainCanvas.Height; double newOffsetX = MainScrollViewer.HorizontalOffset - dXInTargetPixels * multiplicatorX; double newOffsetY = MainScrollViewer.VerticalOffset - dYInTargetPixels * multiplicatorY; if (double.IsNaN(newOffsetX) || double.IsNaN(newOffsetY)) { return; } MainScrollViewer.ScrollToHorizontalOffset(newOffsetX); MainScrollViewer.ScrollToVerticalOffset(newOffsetY); } } }