from System.Windows import Application, Point from System.Windows.Controls import Canvas from System.Windows.Browser import HtmlPage,HtmlEventArgs from System import EventHandler class DeepZoomScene(object): def __init__(self): self.scene = Application.Current.LoadRootVisual(Canvas(), "app.xaml") self.scene.msi.MouseLeftButtonDown += self.mouseButtonDown self.scene.msi.MouseLeftButtonUp += self.mouseButtonUp self.scene.msi.MouseMove += self.mouseMove self.scene.msi.MouseEnter += self.mouseEnter self.scene.msi.MouseLeave += self.mouseLeave if HtmlPage.IsEnabled: HtmlPage.Window.AttachEvent("DOMMouseScroll", EventHandler[HtmlEventArgs](self.mouseWheel)) HtmlPage.Window.AttachEvent("onmousewheel", EventHandler[HtmlEventArgs](self.mouseWheel)) HtmlPage.Document.AttachEvent("onmousewheel", EventHandler[HtmlEventArgs](self.mouseWheel)) self.mouseButtonPressed = False self.mouseIsDragging = False self.IsMouseOver = False self.lastMousePos = Point() def mouseButtonDown(self, sender,e): self.mouseButtonPressed = True self.mouseIsDragging = False self.dragOffset = e.GetPosition(self.scene) self.currentPosition = self.scene.msi.ViewportOrigin def mouseButtonUp(self, sender, e): self.mouseButtonPressed = False if not self.mouseIsDragging: self.zoom(2.0, self.lastMousePos) self.mouseIsDragging = False def mouseMove(self, o,e): pos = e.GetPosition(self.scene.msi) self.lastMousePos = pos if self.mouseButtonPressed: self.mouseIsDragging = True newOrigin = Point() newOrigin.X = self.currentPosition.X - (((pos.X - self.dragOffset.X) /self.scene.msi.ActualWidth) * self.scene.msi.ViewportWidth) newOrigin.Y = self.currentPosition.Y - (((pos.Y - self.dragOffset.Y) /self.scene.msi.ActualHeight) * self.scene.msi.ViewportWidth) self.scene.msi.ViewportOrigin = newOrigin def mouseWheel(self, sender, args): if self.IsMouseOver: delta = args.EventObject.GetProperty("wheelDelta") if HtmlPage.Window.GetProperty("opera") != None: delta = -delta if delta == None: delta = -(args.EventObject.GetProperty("detail"))/3 if HtmlPage.BrowserInformation.UserAgent.IndexOf("Macintosh") != -1: delta = delta*3 if delta > 0: self.zoom(1.1, self.lastMousePos) else: self.zoom(0.9, self.lastMousePos) def mouseEnter(self, sender, e): self.IsMouseOver = True def mouseLeave(self, sender, e): self.IsMouseOver = False self.mouseIsDragging = False def zoom(self, zoomFactor, position): pos = self.scene.msi.ElementToLogicalPoint(position) self.scene.msi.ZoomAboutLogicalPoint(zoomFactor, pos.X, pos.Y) DeepZoomScene()