diff --git a/SampleApps/AvaloniaApp/MainWindow.axaml b/SampleApps/AvaloniaApp/MainWindow.axaml index 76ce165c..5b5f6b5f 100644 --- a/SampleApps/AvaloniaApp/MainWindow.axaml +++ b/SampleApps/AvaloniaApp/MainWindow.axaml @@ -14,7 +14,15 @@ ZoomLevel="11" MinZoomLevel="3" Center="53.5,8.2" ManipulationModes="All" - DoubleTapped="MapDoubleTapped"> + DoubleTapped="MapDoubleTapped" + PointerPressed="MapPointerPressed" + PointerReleased="MapPointerReleased" + PointerMoved="MapPointerMoved" + PointerExited="MapPointerExited"> + + @@ -92,6 +100,15 @@ + + + + + + ().Select(item => item.Name))); } + private void ResetHeadingButtonClick(object sender, Avalonia.Interactivity.RoutedEventArgs e) + { + map.TargetHeading = 0d; + } + private void MapItemsControlDoubleTapped(object sender, TappedEventArgs e) { e.Handled = true; // prevent MapDoubleTapped @@ -39,9 +46,104 @@ namespace SampleApplication map.TargetCenter = map.ViewToLocation(e.GetPosition(map)); } - private void ResetHeadingButtonClick(object sender, Avalonia.Interactivity.RoutedEventArgs e) + private void MapPointerPressed(object sender, PointerPressedEventArgs e) { - map.TargetHeading = 0d; + if (e.Pointer.Type == PointerType.Mouse) + { + var point = e.GetCurrentPoint(map); + + if (point.Properties.IsRightButtonPressed) + { + e.Pointer.Capture(map); + var location = map.ViewToLocation(point.Position); + + if (location != null) + { + measurementLine.IsVisible = true; + measurementLine.Locations = new LocationCollection(location); + } + } + } + } + + private void MapPointerReleased(object sender, PointerReleasedEventArgs e) + { + if (e.Pointer.Captured == map) + { + e.Pointer.Capture(null); + measurementLine.IsVisible = false; + measurementLine.Locations = null; + } + } + + private void MapPointerMoved(object sender, PointerEventArgs e) + { + var location = map.ViewToLocation(e.GetPosition(map)); + + if (location != null) + { + mouseLocation.IsVisible = true; + mouseLocation.Text = GetLatLonText(location); + + var start = measurementLine.Locations?.FirstOrDefault(); + + if (start != null) + { + measurementLine.Locations = LocationCollection.OrthodromeLocations(start, location); + mouseLocation.Text += GetDistanceText(location.GetDistance(start)); + } + } + else + { + mouseLocation.IsVisible = false; + mouseLocation.Text = ""; + } + } + + private void MapPointerExited(object sender, PointerEventArgs e) + { + mouseLocation.IsVisible = false; + mouseLocation.Text = ""; + } + + private static string GetLatLonText(MapControl.Location location) + { + var latitude = (int)Math.Round(location.Latitude * 60000d); + var longitude = (int)Math.Round(MapControl.Location.NormalizeLongitude(location.Longitude) * 60000d); + var latHemisphere = 'N'; + var lonHemisphere = 'E'; + + if (latitude < 0) + { + latitude = -latitude; + latHemisphere = 'S'; + } + + if (longitude < 0) + { + longitude = -longitude; + lonHemisphere = 'W'; + } + + return string.Format(CultureInfo.InvariantCulture, + "{0} {1:00} {2:00.000}\n{3} {4:000} {5:00.000}", + latHemisphere, latitude / 60000, (latitude % 60000) / 1000d, + lonHemisphere, longitude / 60000, (longitude % 60000) / 1000d); + } + + private string GetDistanceText(double distance) + { + var unit = "m"; + + if (distance >= 1000d) + { + distance /= 1000d; + unit = "km"; + } + + var distanceFormat = distance >= 100d ? "F0" : "F1"; + + return string.Format(CultureInfo.InvariantCulture, "\n {0:" + distanceFormat + "} {1}", distance, unit); } } } diff --git a/SampleApps/UniversalApp/MainPage.xaml.cs b/SampleApps/UniversalApp/MainPage.xaml.cs index aa065a20..9b06f5ab 100644 --- a/SampleApps/UniversalApp/MainPage.xaml.cs +++ b/SampleApps/UniversalApp/MainPage.xaml.cs @@ -45,7 +45,7 @@ namespace SampleApplication { var point = e.GetCurrentPoint(map); - if (point.Properties.IsRightButtonPressed) + if (point.Properties.IsRightButtonPressed && map.CapturePointer(e.Pointer)) { var location = map.ViewToLocation(point.Position); @@ -55,8 +55,7 @@ namespace SampleApplication measurementLine.Locations = new LocationCollection(location); } } - else if (e.KeyModifiers.HasFlag(VirtualKeyModifiers.Control) && - map.MapLayer is WmsImageLayer wmsLayer) + else if (e.KeyModifiers.HasFlag(VirtualKeyModifiers.Control) && map.MapLayer is WmsImageLayer wmsLayer) { Debug.WriteLine(await wmsLayer.GetFeatureInfoAsync(point.Position)); } @@ -65,8 +64,12 @@ namespace SampleApplication private void MapPointerReleased(object sender, PointerRoutedEventArgs e) { - measurementLine.Visibility = Visibility.Collapsed; - measurementLine.Locations = null; + if (e.Pointer.PointerDeviceType == PointerDeviceType.Mouse) + { + map.ReleasePointerCapture(e.Pointer); + measurementLine.Visibility = Visibility.Collapsed; + measurementLine.Locations = null; + } } private void MapPointerMoved(object sender, PointerRoutedEventArgs e) diff --git a/SampleApps/WinUiApp/MainWindow.xaml.cs b/SampleApps/WinUiApp/MainWindow.xaml.cs index e0649116..6dc62f0a 100644 --- a/SampleApps/WinUiApp/MainWindow.xaml.cs +++ b/SampleApps/WinUiApp/MainWindow.xaml.cs @@ -57,7 +57,7 @@ namespace SampleApplication { var point = e.GetCurrentPoint(map); - if (point.Properties.IsRightButtonPressed) + if (point.Properties.IsRightButtonPressed && map.CapturePointer(e.Pointer)) { var location = map.ViewToLocation(point.Position); @@ -67,8 +67,7 @@ namespace SampleApplication measurementLine.Locations = new LocationCollection(location); } } - else if (e.KeyModifiers.HasFlag(VirtualKeyModifiers.Control) && - map.MapLayer is WmsImageLayer wmsLayer) + else if (e.KeyModifiers.HasFlag(VirtualKeyModifiers.Control) && map.MapLayer is WmsImageLayer wmsLayer) { Debug.WriteLine(await wmsLayer.GetFeatureInfoAsync(point.Position)); } @@ -77,8 +76,12 @@ namespace SampleApplication private void MapPointerReleased(object sender, PointerRoutedEventArgs e) { - measurementLine.Visibility = Visibility.Collapsed; - measurementLine.Locations = null; + if (e.Pointer.PointerDeviceType == PointerDeviceType.Mouse) + { + map.ReleasePointerCapture(e.Pointer); + measurementLine.Visibility = Visibility.Collapsed; + measurementLine.Locations = null; + } } private void MapPointerMoved(object sender, PointerRoutedEventArgs e) diff --git a/SampleApps/WpfApplication/MainWindow.xaml.cs b/SampleApps/WpfApplication/MainWindow.xaml.cs index 51b6b7f2..02d589c3 100644 --- a/SampleApps/WpfApplication/MainWindow.xaml.cs +++ b/SampleApps/WpfApplication/MainWindow.xaml.cs @@ -5,6 +5,7 @@ using System.Globalization; using System.Linq; using System.Windows; using System.Windows.Controls; +using System.Windows.Data; using System.Windows.Input; namespace SampleApplication @@ -61,7 +62,7 @@ namespace SampleApplication { var location = map.ViewToLocation(e.GetPosition(map)); - if (location != null) + if (location != null && map.CaptureMouse()) { measurementLine.Visibility = Visibility.Visible; measurementLine.Locations = new LocationCollection(location); @@ -70,6 +71,7 @@ namespace SampleApplication private void MapMouseRightButtonUp(object sender, MouseButtonEventArgs e) { + map.ReleaseMouseCapture(); measurementLine.Visibility = Visibility.Collapsed; measurementLine.Locations = null; }