// XAML Map Control - https://github.com/ClemensFischer/XAML-Map-Control // Copyright © 2024 Clemens Fischer // Licensed under the Microsoft Public License (Ms-PL) using Avalonia.Input; namespace MapControl { /// /// MapBase with default input event handling. /// public class Map : MapBase { public static readonly StyledProperty MouseWheelZoomDeltaProperty = AvaloniaProperty.Register(nameof(MouseWheelZoomDelta), 0.25); private Point? mousePosition; /// /// Gets or sets the amount by which the ZoomLevel property changes by a MouseWheel event. /// The default value is 0.25. /// public double MouseWheelZoomDelta { get => GetValue(MouseWheelZoomDeltaProperty); set => SetValue(MouseWheelZoomDeltaProperty, value); } protected override void OnPointerWheelChanged(PointerWheelEventArgs e) { base.OnPointerWheelChanged(e); ZoomMap(e.GetPosition(this), TargetZoomLevel + MouseWheelZoomDelta * e.Delta.Y); } protected override void OnPointerPressed(PointerPressedEventArgs e) { base.OnPointerPressed(e); var point = e.GetCurrentPoint(this); if (point.Properties.IsLeftButtonPressed) { e.Pointer.Capture(this); mousePosition = point.Position; } } protected override void OnPointerReleased(PointerReleasedEventArgs e) { base.OnPointerReleased(e); if (mousePosition.HasValue) { e.Pointer.Capture(null); mousePosition = null; } } protected override void OnPointerMoved(PointerEventArgs e) { base.OnPointerMoved(e); if (mousePosition.HasValue) { var position = e.GetPosition(this); TranslateMap(position - mousePosition.Value); mousePosition = position; } } } }