From 47a96b22cc65ded6555f64eaf14444d5eb7b7f58 Mon Sep 17 00:00:00 2001 From: ClemensFischer Date: Sat, 12 Nov 2022 11:08:10 +0100 Subject: [PATCH] Improve touch input handling --- MapControl/Shared/MapImageLayer.cs | 11 +++++-- MapControl/Shared/MapTileLayerBase.cs | 2 +- MapControl/Shared/Tile.cs | 7 ++++- MapControl/WinUI/Map.WinUI.cs | 44 +-------------------------- 4 files changed, 17 insertions(+), 47 deletions(-) diff --git a/MapControl/Shared/MapImageLayer.cs b/MapControl/Shared/MapImageLayer.cs index 8a683126..87b17499 100644 --- a/MapControl/Shared/MapImageLayer.cs +++ b/MapControl/Shared/MapImageLayer.cs @@ -149,8 +149,15 @@ namespace MapControl } else if (Children.Count == 0) { - Children.Add(new Image { Opacity = 0d, Stretch = Stretch.Fill }); - Children.Add(new Image { Opacity = 0d, Stretch = Stretch.Fill }); + for (int i = 0; i < 2; i++) + { + Children.Add(new Image + { + Opacity = 0d, + Stretch = Stretch.Fill, + IsHitTestVisible = false // avoid touch capture issues + }); + } } base.SetParentMap(map); diff --git a/MapControl/Shared/MapTileLayerBase.cs b/MapControl/Shared/MapTileLayerBase.cs index a9c42f86..cfad25d6 100644 --- a/MapControl/Shared/MapTileLayerBase.cs +++ b/MapControl/Shared/MapTileLayerBase.cs @@ -52,7 +52,7 @@ namespace MapControl new PropertyMetadata(TimeSpan.FromSeconds(0.2), (o, e) => ((MapTileLayerBase)o).updateTimer.Interval = (TimeSpan)e.NewValue)); public static readonly DependencyProperty UpdateWhileViewportChangingProperty = DependencyProperty.Register( - nameof(UpdateWhileViewportChanging), typeof(bool), typeof(MapTileLayerBase), new PropertyMetadata(false)); + nameof(UpdateWhileViewportChanging), typeof(bool), typeof(MapTileLayerBase), new PropertyMetadata(true)); public static readonly DependencyProperty MapBackgroundProperty = DependencyProperty.Register( nameof(MapBackground), typeof(Brush), typeof(MapTileLayerBase), new PropertyMetadata(null)); diff --git a/MapControl/Shared/Tile.cs b/MapControl/Shared/Tile.cs index 0321f1fd..41277f3c 100644 --- a/MapControl/Shared/Tile.cs +++ b/MapControl/Shared/Tile.cs @@ -43,7 +43,12 @@ namespace MapControl } } - public Image Image { get; } = new Image { Opacity = 0d, Stretch = Stretch.Fill }; + public Image Image { get; } = new Image + { + Opacity = 0d, + Stretch = Stretch.Fill, + IsHitTestVisible = false // avoid touch capture issues + }; public bool Pending { get; set; } = true; diff --git a/MapControl/WinUI/Map.WinUI.cs b/MapControl/WinUI/Map.WinUI.cs index 2aee2a8c..420f9404 100644 --- a/MapControl/WinUI/Map.WinUI.cs +++ b/MapControl/WinUI/Map.WinUI.cs @@ -23,7 +23,6 @@ namespace MapControl public static readonly DependencyProperty MouseWheelZoomDeltaProperty = DependencyProperty.Register( nameof(MouseWheelZoomDelta), typeof(double), typeof(Map), new PropertyMetadata(0.25)); - private Point? mousePosition; private double mouseWheelDelta; public Map() @@ -35,9 +34,6 @@ namespace MapControl | ManipulationModes.TranslateInertia; ManipulationDelta += OnManipulationDelta; - PointerPressed += OnPointerPressed; - PointerReleased += OnPointerReleased; - PointerMoved += OnPointerMoved; PointerWheelChanged += OnPointerWheelChanged; } @@ -53,45 +49,7 @@ namespace MapControl private void OnManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e) { - if (!mousePosition.HasValue) - { - TransformMap(e.Position, e.Delta.Translation, e.Delta.Rotation, e.Delta.Scale); - } - } - - private void OnPointerPressed(object sender, PointerRoutedEventArgs e) - { - if (e.Pointer.PointerDeviceType == PointerDeviceType.Mouse && - CapturePointer(e.Pointer)) - { - mousePosition = e.GetCurrentPoint(this).Position; - } - } - - private void OnPointerReleased(object sender, PointerRoutedEventArgs e) - { - if (e.Pointer.PointerDeviceType == PointerDeviceType.Mouse && - mousePosition.HasValue) - { - mousePosition = null; - ReleasePointerCaptures(); - } - } - - private void OnPointerMoved(object sender, PointerRoutedEventArgs e) - { - // Perform translation by explicit Mouse input because with Manipulation pointer capture is - // lost when Map content changes, e.g. when a MapTileLayer or WmsImageLayer loads new images. - - if (e.Pointer.PointerDeviceType == PointerDeviceType.Mouse && - mousePosition.HasValue) - { - Point position = e.GetCurrentPoint(this).Position; - var translation = position - mousePosition.Value; - mousePosition = position; - - TranslateMap(translation); - } + TransformMap(e.Position, e.Delta.Translation, e.Delta.Rotation, e.Delta.Scale); } private void OnPointerWheelChanged(object sender, PointerRoutedEventArgs e)