Input handling in Avalonia Map and MapItem

This commit is contained in:
ClemensFischer 2025-03-19 17:16:22 +01:00
parent f2d82e910b
commit 1bb03e1102
3 changed files with 22 additions and 20 deletions

View file

@ -72,15 +72,20 @@ namespace MapControl
{ {
HandleManipulation(point.Pointer, point.Position); HandleManipulation(point.Pointer, point.Position);
} }
else if (point.Pointer.Type == PointerType.Mouse || ManipulationModes.HasFlag(ManipulationModes.Translate)) else if (point.Pointer.Type == PointerType.Mouse ||
ManipulationModes.HasFlag(ManipulationModes.Translate))
{ {
TranslateMap(new Point(point.Position.X - position1.X, point.Position.Y - position1.Y)); TranslateMap(new Point(point.Position.X - position1.X, point.Position.Y - position1.Y));
position1 = point.Position; position1 = point.Position;
} }
} }
else if ( else if (pointer1 == null &&
pointer1 == null && point.Pointer.Type == PointerType.Mouse && point.Properties.IsLeftButtonPressed && e.KeyModifiers == KeyModifiers.None || point.Pointer.Type == PointerType.Mouse &&
pointer2 == null && point.Pointer.Type == PointerType.Touch && ManipulationModes != ManipulationModes.None) point.Properties.IsLeftButtonPressed &&
e.KeyModifiers == KeyModifiers.None ||
pointer2 == null &&
point.Pointer.Type == PointerType.Touch &&
ManipulationModes != ManipulationModes.None)
{ {
point.Pointer.Capture(this); point.Pointer.Capture(this);

View file

@ -11,9 +11,10 @@
protected override void OnPointerPressed(PointerPressedEventArgs e) protected override void OnPointerPressed(PointerPressedEventArgs e)
{ {
if (e.Pointer.Type == PointerType.Touch) if (e.Pointer.Type != PointerType.Mouse &&
ItemsControl.ItemsControlFromItemContainer(this) is MapItemsControl mapItemsControl)
{ {
UpdateSelection(e); mapItemsControl.UpdateSelection(this, e);
} }
e.Handled = true; e.Handled = true;
@ -21,19 +22,14 @@
protected override void OnPointerReleased(PointerReleasedEventArgs e) protected override void OnPointerReleased(PointerReleasedEventArgs e)
{ {
UpdateSelection(e); if (e.Pointer.Type == PointerType.Mouse &&
e.InitialPressMouseButton == MouseButton.Left &&
ItemsControl.ItemsControlFromItemContainer(this) is MapItemsControl mapItemsControl)
{
mapItemsControl.UpdateSelection(this, e);
}
e.Handled = true; e.Handled = true;
} }
private void UpdateSelection(PointerEventArgs e)
{
if (ItemsControl.ItemsControlFromItemContainer(this) is MapItemsControl mapItemsControl)
{
mapItemsControl.UpdateSelection(this,
e.KeyModifiers.HasFlag(KeyModifiers.Control),
e.KeyModifiers.HasFlag(KeyModifiers.Shift));
}
}
} }
} }

View file

@ -57,15 +57,16 @@ namespace MapControl
} }
} }
internal void UpdateSelection(MapItem mapItem, bool controlKeyPressed, bool shiftKeyPressed) internal void UpdateSelection(MapItem mapItem, PointerEventArgs e)
{ {
if (SelectionMode != SelectionMode.Single && shiftKeyPressed) if (SelectionMode != SelectionMode.Single &&
e.KeyModifiers.HasFlag(KeyModifiers.Shift))
{ {
SelectItemsInRange(mapItem); SelectItemsInRange(mapItem);
} }
else else
{ {
UpdateSelection(mapItem, true, false, controlKeyPressed); UpdateSelection(mapItem, true, false, e.KeyModifiers.HasFlag(KeyModifiers.Control));
} }
} }
} }