public DZContext(MultiScaleImage msi) { TargetViewportWidth = 1; MinViewportWidth = .05; MaxViewportWidth = 2; Owner = msi; Owner.UseSprings = false; Owner.ViewportChanged += new RoutedEventHandler(Owner_ViewportChanged); ImagesToHide = new List<MultiScaleSubImage>(); ImagesToShow = new List<MultiScaleSubImage>(); /* --------------------------------------------------------------------------------------------------- -- Start Mouse and Keyboard handler for the MultiScaleImage -- This block of code is the mouse and keyboard handler for the DeepZoom control. Parts of this code is borrowed from Scott Hanselman's and Soul Solutions blogs // Based on prior work done by Lutz Gerhard, Peter Blois, and Scott Hanselman ---------------------------------------------------------------------------------------------------- */ bool mouseButtonPressed = false; bool dragInProgress = false; Point dragOffset = new Point(); Point currentPosition = new Point(); msi.ImageOpenSucceeded += new RoutedEventHandler(msi_ImageOpenSucceeded); msi.MotionFinished += new RoutedEventHandler(ArrangeOnFirstMotionFinished_MotionFinished); /* KeyDown += delegate(object sender, KeyEventArgs e) { Point p = msi.ElementToLogicalPoint(new Point((msi.Width / 2), ((msi.Width / msi.AspectRatio) / 2))); switch (e.Key) { case Key.I: case Key.C: case Key.Add: msi.ZoomAboutLogicalPoint(1.1, p.X, p.Y); break; case Key.O: case Key.Space: case Key.Subtract: msi.ZoomAboutLogicalPoint(0.9, p.X, p.Y); break; case Key.Left: case Key.A: msi.ViewportOrigin = new Point(msi.ViewportOrigin.X - 0.1, msi.ViewportOrigin.Y); break; case Key.Right: case Key.D: msi.ViewportOrigin = new Point(msi.ViewportOrigin.X + 0.1, msi.ViewportOrigin.Y); break; case Key.Up: case Key.W: msi.ViewportOrigin = new Point(msi.ViewportOrigin.X, msi.ViewportOrigin.Y - 0.1); break; case Key.Down: case Key.S: msi.ViewportOrigin = new Point(msi.ViewportOrigin.X, msi.ViewportOrigin.Y + 0.1); break; case Key.R: RandomizeAndArrange(); break; } }; */ msi.MouseWheel += delegate(object sender, MouseWheelEventArgs e) { DZContext context = this; if (!context.IsMouseWheelEnabled) return; e.Handled = true; if (e.Delta > 0) msi.Zoom(1.2, context.LastMousePosition); //, context.IsZoomForceEnabled); else msi.Zoom(0.8, context.LastMousePosition); //, context.IsZoomForceEnabled); context.ClickedImageIndex = -1; }; msi.MouseLeave += delegate(object sender, MouseEventArgs e) { if (mouseButtonPressed) { mouseButtonPressed = false; dragInProgress = false; } }; msi.MouseLeftButtonDown += delegate(object sender, MouseButtonEventArgs e) { mouseButtonPressed = false; if (IsMousePanEnabled) { mouseButtonPressed = true; } dragInProgress = false; dragOffset = e.GetPosition(msi); currentPosition = msi.ViewportOrigin; ClickedImageIndex = -1; }; msi.MouseMove += delegate(object sender, MouseEventArgs e) { if (mouseButtonPressed) { dragInProgress = true; Point newOrigin = new Point(); newOrigin.X = currentPosition.X - (((e.GetPosition(msi).X - dragOffset.X) / msi.ActualWidth) * msi.ViewportWidth); newOrigin.Y = currentPosition.Y - (((e.GetPosition(msi).Y - dragOffset.Y) / msi.ActualHeight) * msi.ViewportWidth); msi.ViewportOrigin = newOrigin; } LastMousePosition = e.GetPosition(msi); }; msi.MouseLeftButtonUp += delegate(object sender, MouseButtonEventArgs e) { if (mouseButtonPressed && !dragInProgress) { Point p = msi.ElementToLogicalPoint(e.GetPosition(msi)); int subImageIndex = msi.SubImageHitTest(p); if (subImageIndex >= 0) { msi.DisplaySubImageCentered(subImageIndex); ClickedImageIndex = subImageIndex; } if (IsZoomOnClickEnabled) { bool shiftDown = (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift; if (shiftDown) msi.Zoom(0.5, e.GetPosition(msi)); else msi.Zoom(2.0, e.GetPosition(msi)); } } mouseButtonPressed = false; dragInProgress = false; }; }