Index: Core/Components/src/Core.Components.GraphSharp.Forms/PointedTreeGraphControl.cs =================================================================== diff -u -r1fb18822ebf5a2e3dae6eb2dc3c4687e4d1d0e62 -rd0717faa6f35e514ae6f2dd1c1abd701de8cfab7 --- Core/Components/src/Core.Components.GraphSharp.Forms/PointedTreeGraphControl.cs (.../PointedTreeGraphControl.cs) (revision 1fb18822ebf5a2e3dae6eb2dc3c4687e4d1d0e62) +++ Core/Components/src/Core.Components.GraphSharp.Forms/PointedTreeGraphControl.cs (.../PointedTreeGraphControl.cs) (revision d0717faa6f35e514ae6f2dd1c1abd701de8cfab7) @@ -22,7 +22,7 @@ using System; using System.Windows; using System.Windows.Forms; -using System.Windows.Media; +using System.Windows.Input; using Core.Common.Utils.Extensions; using Core.Components.GraphSharp.Converters; using Core.Components.GraphSharp.Data; @@ -76,7 +76,8 @@ zoomControl = new ZoomControl { Mode = ZoomControlModes.Original, - ModifierMode = ZoomViewModifierMode.None + ModifierMode = ZoomViewModifierMode.None, + ZoomDeltaMultiplier = 300 }; graphLayout = new PointedTreeGraphLayout(); @@ -85,6 +86,7 @@ graphLayout.Graph = graph; zoomControl.Content = graphLayout; + zoomControl.PreviewMouseWheel += ZoomControl_MouseWheel; var myResourceDictionary = new ResourceDictionary { @@ -107,5 +109,32 @@ graph.AddEdge(new PointedTreeEdge(parentVertex, vertex)); } } + + private void ZoomControl_MouseWheel(object sender, MouseWheelEventArgs e) + { + double deltaZoom = GetZoomDelta(e.Delta); + double width = zoomControl.ActualWidth * deltaZoom; + double height = zoomControl.ActualHeight * deltaZoom; + + Point cursorPosition = e.GetPosition(zoomControl); + double currentRelativeLeft = cursorPosition.X / zoomControl.ActualWidth; + double currentRelativeTop = cursorPosition.Y / zoomControl.ActualHeight; + + var topLeftCorner = new Point( + cursorPosition.X - width * currentRelativeLeft, + cursorPosition.Y - height * currentRelativeTop); + + var newSize = new Size(width, height); + var zoomTo = new Rect(topLeftCorner, newSize); + + zoomControl.ZoomTo(zoomTo); + e.Handled = true; + } + + private double GetZoomDelta(int delta) + { + return Math.Max(1.0 / zoomControl.MaxZoomDelta, + Math.Min(zoomControl.MaxZoomDelta, delta / -zoomControl.ZoomDeltaMultiplier + 1.0)); + } } } \ No newline at end of file Index: Core/Components/test/Core.Components.GraphSharp.Forms.Test/PointedTreeGraphControlTest.cs =================================================================== diff -u -r40514f2e47eded8cd37dad8d7e17829e77565d92 -rd0717faa6f35e514ae6f2dd1c1abd701de8cfab7 --- Core/Components/test/Core.Components.GraphSharp.Forms.Test/PointedTreeGraphControlTest.cs (.../PointedTreeGraphControlTest.cs) (revision 40514f2e47eded8cd37dad8d7e17829e77565d92) +++ Core/Components/test/Core.Components.GraphSharp.Forms.Test/PointedTreeGraphControlTest.cs (.../PointedTreeGraphControlTest.cs) (revision d0717faa6f35e514ae6f2dd1c1abd701de8cfab7) @@ -54,6 +54,10 @@ var elementHost = graphControl.Controls[0] as ElementHost; var zoomControl = (ZoomControl) elementHost.Child; + Assert.AreEqual(300, zoomControl.ZoomDeltaMultiplier); + Assert.AreEqual(ZoomControlModes.Original, zoomControl.Mode); + Assert.AreEqual(ZoomViewModifierMode.None, zoomControl.ModifierMode); + Assert.AreEqual(1, zoomControl.Resources.MergedDictionaries.Count); ResourceDictionary templateDictionary = zoomControl.Resources.MergedDictionaries.First(); Assert.AreEqual("/Core.Components.GraphSharp.Forms;component/Templates/PointedTreeGraphTemplate.xaml", templateDictionary.Source.AbsolutePath);