using System; using System.Windows; using System.Windows.Browser; namespace Blois.Utils { // Code ported from Javascript version at http://adomas.org/javascript-mouse-wheel/ public class MouseWheelEventArgs : BubblingEventArgs { public MouseWheelEventArgs(FrameworkElement source, double delta): base(source) { this.Delta = delta; } public double Delta { get; private set; } } public class MouseWheelGenerator { public static readonly BubblingEvent MouseWheelEvent = new BubblingEvent("MouseWheel", RoutingStrategy.Bubble); private static MouseWheelGenerator helper = new MouseWheelGenerator(); private MouseWheelGenerator() { if (HtmlPage.IsEnabled) { HtmlPage.Window.AttachEvent("DOMMouseScroll", this.HandleMouseWheel); HtmlPage.Window.AttachEvent("onmousewheel", this.HandleMouseWheel); HtmlPage.Document.AttachEvent("onmousewheel", this.HandleMouseWheel); } } private void HandleMouseWheel(object sender, HtmlEventArgs args) { double delta = 0; ScriptObject eventObj = args.EventObject; if (eventObj.GetProperty("wheelDelta") != null) { delta = ((double)eventObj.GetProperty("wheelDelta")) /120; if (HtmlPage.Window.GetProperty("opera") != null) delta = -delta; } else if (eventObj.GetProperty("detail") != null) { delta = -((double)eventObj.GetProperty("detail"))/3; if (HtmlPage.BrowserInformation.UserAgent.IndexOf("Macintosh") != -1) delta = delta * 3; } if (delta != 0) { if (this.OnMouseWheel(delta, args)) args.PreventDefault(); } } private bool OnMouseWheel(double delta, HtmlEventArgs e) { Point mousePosition = new Point(e.ClientX, e.ClientY); if (HtmlPage.BrowserInformation.Name.Contains("Netscape")) mousePosition = new Point(e.ScreenX, e.ScreenY); UIElement rootVisual = (UIElement)Application.Current.RootVisual; UIElement firstElement = null; foreach (UIElement element in rootVisual.HitTest(mousePosition)) { firstElement = element; break; } if (firstElement != null) { FrameworkElement source = (FrameworkElement)firstElement; MouseWheelEventArgs wheelArgs = new MouseWheelEventArgs(source, delta); MouseWheelGenerator.MouseWheelEvent.RaiseEvent(wheelArgs, source); return wheelArgs.Handled; } return false; } } }