Removed MoveMap feature

This commit is contained in:
ClemensFischer 2025-01-06 15:33:12 +01:00
parent 4c669f4df0
commit 4b2771d27d
6 changed files with 86 additions and 116 deletions

View file

@ -70,33 +70,55 @@ namespace MapControl
{ {
var point = e.GetCurrentPoint(this); var point = e.GetCurrentPoint(this);
if (point.Pointer.Type == PointerType.Mouse && HandleMousePressed(point) || if (pointer1 == null && point.Pointer.Type == PointerType.Mouse && point.Properties.IsLeftButtonPressed ||
point.Pointer.Type == PointerType.Touch && HandleTouchPressed(point)) pointer2 == null && point.Pointer.Type == PointerType.Touch && ManipulationModes != ManipulationModes.None)
{ {
point.Pointer.Capture(this); point.Pointer.Capture(this);
SetTransformCenter(point.Position);
if (pointer1 == null)
{
pointer1 = point.Pointer;
position1 = point.Position;
}
else
{
pointer2 = point.Pointer;
position2 = point.Position;
}
} }
base.OnPointerPressed(e); base.OnPointerPressed(e);
} }
private void HandlePointerReleased(IPointer pointer, bool releaseCapture)
{
if (pointer == pointer1 || pointer == pointer2)
{
if (pointer == pointer1)
{
pointer1 = pointer2;
position1 = position2;
}
pointer2 = null;
if (releaseCapture)
{
pointer.Capture(null);
}
}
}
protected override void OnPointerReleased(PointerReleasedEventArgs e) protected override void OnPointerReleased(PointerReleasedEventArgs e)
{ {
if (HandlePointerReleased(e.Pointer)) HandlePointerReleased(e.Pointer, true);
{
EndMoveMap();
e.Pointer.Capture(null);
}
base.OnPointerReleased(e); base.OnPointerReleased(e);
} }
protected override void OnPointerCaptureLost(PointerCaptureLostEventArgs e) protected override void OnPointerCaptureLost(PointerCaptureLostEventArgs e)
{ {
if (HandlePointerReleased(e.Pointer)) HandlePointerReleased(e.Pointer, false);
{
EndMoveMap();
}
base.OnPointerCaptureLost(e); base.OnPointerCaptureLost(e);
} }
@ -113,66 +135,14 @@ namespace MapControl
} }
else if (e.Pointer.Type == PointerType.Mouse || ManipulationModes.HasFlag(ManipulationModes.Translate)) else if (e.Pointer.Type == PointerType.Mouse || ManipulationModes.HasFlag(ManipulationModes.Translate))
{ {
TranslateMap(new Point(position.X - position1.X, position.Y - position1.Y));
position1 = position; position1 = position;
MoveMap(position);
} }
} }
base.OnPointerMoved(e); base.OnPointerMoved(e);
} }
private bool HandleMousePressed(PointerPoint point)
{
var handled = pointer1 == null && point.Properties.IsLeftButtonPressed;
if (handled)
{
pointer1 = point.Pointer;
position1 = point.Position;
}
return handled;
}
private bool HandleTouchPressed(PointerPoint point)
{
var handled = pointer2 == null && ManipulationModes != ManipulationModes.None;
if (handled)
{
if (pointer1 == null)
{
pointer1 = point.Pointer;
position1 = point.Position;
}
else
{
pointer2 = point.Pointer;
position2 = point.Position;
}
}
return handled;
}
private bool HandlePointerReleased(IPointer pointer)
{
var handled = pointer == pointer1 || pointer == pointer2;
if (handled)
{
if (pointer == pointer1)
{
pointer1 = pointer2;
position1 = position2;
}
pointer2 = null;
}
return handled;
}
private void HandleManipulation(IPointer pointer, Point position) private void HandleManipulation(IPointer pointer, Point position)
{ {
var oldDistance = new Vector(position2.X - position1.X, position2.Y - position1.Y); var oldDistance = new Vector(position2.X - position1.X, position2.Y - position1.Y);

View file

@ -277,39 +277,11 @@ namespace MapControl
viewCenter = new Point(ActualWidth / 2d, ActualHeight / 2d); viewCenter = new Point(ActualWidth / 2d, ActualHeight / 2d);
} }
/// <summary>
/// Moves the map by the difference of the specified position in view coordinates and a temporary
/// transform origin point that has been set before by a call to SetTransformCenter. Map movement
/// must be terminated by a call to EndMoveMap. MoveMap provides higher accuracy than TranslateMap.
/// </summary>
public void MoveMap(Point position)
{
if (transformCenter != null)
{
viewCenter = position;
UpdateTransform();
}
}
/// <summary>
/// Terminates map movement by the MoveMap method.
/// </summary>
public void EndMoveMap()
{
if (transformCenter != null)
{
ResetTransformCenter();
UpdateTransform();
}
}
/// <summary> /// <summary>
/// Changes the Center property according to the specified translation in view coordinates. /// Changes the Center property according to the specified translation in view coordinates.
/// </summary> /// </summary>
public void TranslateMap(Point translation) public void TranslateMap(Point translation)
{ {
EndMoveMap();
if (translation.X != 0d || translation.Y != 0d) if (translation.X != 0d || translation.Y != 0d)
{ {
var center = ViewToLocation(new Point(viewCenter.X - translation.X, viewCenter.Y - translation.Y)); var center = ViewToLocation(new Point(viewCenter.X - translation.X, viewCenter.Y - translation.Y));
@ -328,7 +300,11 @@ namespace MapControl
/// </summary> /// </summary>
public void TransformMap(Point center, Point translation, double rotation, double scale) public void TransformMap(Point center, Point translation, double rotation, double scale)
{ {
if (rotation != 0d || scale != 1d) if (rotation == 0d && scale == 1d)
{
TranslateMap(translation);
}
else
{ {
SetTransformCenter(center); SetTransformCenter(center);
@ -352,12 +328,6 @@ namespace MapControl
UpdateTransform(true); UpdateTransform(true);
} }
else
{
// More accurate than SetTransformCenter.
//
TranslateMap(translation);
}
} }
/// <summary> /// <summary>

View file

@ -234,6 +234,24 @@ namespace MapControl
{ {
var center = new Point(mapRect.X + mapRect.Width / 2d, mapRect.Y + mapRect.Height / 2d); var center = new Point(mapRect.X + mapRect.Width / 2d, mapRect.Y + mapRect.Height / 2d);
var position = parentMap.ViewTransform.MapToView(center); var position = parentMap.ViewTransform.MapToView(center);
if (parentMap.MapProjection.Type <= MapProjectionType.NormalCylindrical &&
!parentMap.InsideViewBounds(position))
{
var location = parentMap.MapProjection.MapToLocation(center);
if (location != null)
{
var coercedPosition = parentMap.LocationToView(
new Location(location.Latitude, parentMap.CoerceLongitude(location.Longitude)));
if (coercedPosition.HasValue)
{
position = coercedPosition.Value;
}
}
}
var width = mapRect.Width * parentMap.ViewTransform.Scale; var width = mapRect.Width * parentMap.ViewTransform.Scale;
var height = mapRect.Height * parentMap.ViewTransform.Scale; var height = mapRect.Height * parentMap.ViewTransform.Scale;
var x = position.X - width / 2d; var x = position.X - width / 2d;

View file

@ -19,6 +19,7 @@ namespace MapControl
public static readonly DependencyProperty ManipulationModeProperty = public static readonly DependencyProperty ManipulationModeProperty =
DependencyPropertyHelper.Register<Map, ManipulationModes>(nameof(ManipulationMode), ManipulationModes.Translate | ManipulationModes.Scale); DependencyPropertyHelper.Register<Map, ManipulationModes>(nameof(ManipulationMode), ManipulationModes.Translate | ManipulationModes.Scale);
private Point? mousePosition;
private double mouseWheelDelta; private double mouseWheelDelta;
static Map() static Map()
@ -72,21 +73,26 @@ namespace MapControl
{ {
if (Keyboard.Modifiers == ModifierKeys.None && CaptureMouse()) if (Keyboard.Modifiers == ModifierKeys.None && CaptureMouse())
{ {
SetTransformCenter(e.GetPosition(this)); mousePosition = e.GetPosition(this);
} }
} }
private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e) private void OnMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{ {
EndMoveMap(); if (mousePosition.HasValue)
{
mousePosition = null;
ReleaseMouseCapture(); ReleaseMouseCapture();
} }
}
private void OnMouseMove(object sender, MouseEventArgs e) private void OnMouseMove(object sender, MouseEventArgs e)
{ {
if (e.LeftButton == MouseButtonState.Pressed) if (mousePosition.HasValue)
{ {
MoveMap(e.GetPosition(this)); var p = e.GetPosition(this);
TranslateMap(new Point(p.X - mousePosition.Value.X, p.Y - mousePosition.Value.Y));
mousePosition = p;
} }
} }

View file

@ -24,7 +24,7 @@ namespace MapControl
public static readonly DependencyProperty MouseWheelZoomDeltaProperty = public static readonly DependencyProperty MouseWheelZoomDeltaProperty =
DependencyPropertyHelper.Register<Map, double>(nameof(MouseWheelZoomDelta), 0.25); DependencyPropertyHelper.Register<Map, double>(nameof(MouseWheelZoomDelta), 0.25);
private bool mouseMoveEnabled; private Point? mousePosition;
private double mouseWheelDelta; private double mouseWheelDelta;
public Map() public Map()
@ -53,9 +53,11 @@ namespace MapControl
private void OnManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e) private void OnManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
{ {
if (mouseMoveEnabled || e.Delta.Rotation == 0d && e.Delta.Scale == 1d) if (mousePosition.HasValue)
{ {
MoveMap(e.Position); 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) else if (e.PointerDeviceType != PointerDeviceType.Mouse)
{ {
@ -67,20 +69,23 @@ namespace MapControl
{ {
var point = e.GetCurrentPoint(this); var point = e.GetCurrentPoint(this);
mouseMoveEnabled = e.Pointer.PointerDeviceType == PointerDeviceType.Mouse && if (e.Pointer.PointerDeviceType == PointerDeviceType.Mouse &&
e.KeyModifiers == VirtualKeyModifiers.None && e.KeyModifiers == VirtualKeyModifiers.None &&
point.Properties.IsLeftButtonPressed; point.Properties.IsLeftButtonPressed &&
CapturePointer(e.Pointer))
if (mouseMoveEnabled || e.Pointer.PointerDeviceType != PointerDeviceType.Mouse)
{ {
SetTransformCenter(point.Position); mousePosition = point.Position;
} }
} }
private void OnPointerReleased(object sender, PointerRoutedEventArgs e) private void OnPointerReleased(object sender, PointerRoutedEventArgs e)
{ {
mouseMoveEnabled = false; if (mousePosition.HasValue &&
EndMoveMap(); e.Pointer.PointerDeviceType == PointerDeviceType.Mouse)
{
mousePosition = null;
ReleasePointerCapture(e.Pointer);
}
} }
private void OnPointerWheelChanged(object sender, PointerRoutedEventArgs e) private void OnPointerWheelChanged(object sender, PointerRoutedEventArgs e)

View file

@ -147,6 +147,7 @@
<map:Map x:Name="map" <map:Map x:Name="map"
Center="53.5,8.2" Center="53.5,8.2"
MinZoomLevel="2" MaxZoomLevel="21" ZoomLevel="11" MinZoomLevel="2" MaxZoomLevel="21" ZoomLevel="11"
ManipulationMode="All"
DoubleTapped="MapDoubleTapped" DoubleTapped="MapDoubleTapped"
PointerPressed="MapPointerPressed" PointerPressed="MapPointerPressed"
PointerReleased="MapPointerReleased" PointerReleased="MapPointerReleased"