// XAML Map Control - https://github.com/ClemensFischer/XAML-Map-Control // Copyright © Clemens Fischer // Licensed under the Microsoft Public License (Ms-PL) using System; using Windows.System; #if UWP using Windows.Devices.Input; using Windows.UI.Xaml; using Windows.UI.Xaml.Input; #else using Microsoft.UI.Input; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Input; #endif namespace MapControl { /// /// MapBase with default input event handling. /// public class Map : MapBase { public static readonly DependencyProperty MouseWheelZoomDeltaProperty = DependencyPropertyHelper.Register(nameof(MouseWheelZoomDelta), 0.25); private Point? mousePosition; private double mouseWheelDelta; public Map() { ManipulationMode = ManipulationModes.Scale | ManipulationModes.TranslateX | ManipulationModes.TranslateY | ManipulationModes.TranslateInertia; ManipulationDelta += OnManipulationDelta; PointerPressed += OnPointerPressed; PointerReleased += OnPointerReleased; PointerWheelChanged += OnPointerWheelChanged; } /// /// Gets or sets the amount by which the ZoomLevel property changes by a PointerWheelChanged event. /// The default value is 0.25. /// public double MouseWheelZoomDelta { get => (double)GetValue(MouseWheelZoomDeltaProperty); set => SetValue(MouseWheelZoomDeltaProperty, value); } private void OnManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e) { if (mousePosition.HasValue) { var p = e.Position; TranslateMap(new Point(p.X - mousePosition.Value.X, p.Y - mousePosition.Value.Y)); mousePosition = p; } else if (e.PointerDeviceType != PointerDeviceType.Mouse) { TransformMap(e.Position, e.Delta.Translation, e.Delta.Rotation, e.Delta.Scale); } } private void OnPointerPressed(object sender, PointerRoutedEventArgs e) { var point = e.GetCurrentPoint(this); if (e.Pointer.PointerDeviceType == PointerDeviceType.Mouse && e.KeyModifiers == VirtualKeyModifiers.None && point.Properties.IsLeftButtonPressed && CapturePointer(e.Pointer)) { mousePosition = point.Position; } } private void OnPointerReleased(object sender, PointerRoutedEventArgs e) { if (mousePosition.HasValue && e.Pointer.PointerDeviceType == PointerDeviceType.Mouse) { mousePosition = null; ReleasePointerCapture(e.Pointer); } } private void OnPointerWheelChanged(object sender, PointerRoutedEventArgs e) { if (e.Pointer.PointerDeviceType == PointerDeviceType.Mouse) { var point = e.GetCurrentPoint(this); // Standard mouse wheel delta value is 120. // mouseWheelDelta += point.Properties.MouseWheelDelta / 120d; if (Math.Abs(mouseWheelDelta) >= 1d) { // Zoom to integer multiple of MouseWheelZoomDelta. // ZoomMap(point.Position, MouseWheelZoomDelta * Math.Round(TargetZoomLevel / MouseWheelZoomDelta + mouseWheelDelta)); mouseWheelDelta = 0d; } } } } }