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;
}